Я использую MARS и MIPS для назначения CS, где я должен вычислить ((A B) + (C D)) для любых 32-би целых чисел без знака. В конечном итоге я получаю правильный ответ, который должен быть сохранен в $ t8 (старшие значащие биты) и $ t9 (младшие значащие биты). Делая что-то вроде (2 миллиарда * 4) + (4 * 4), я должен отобразить 8 000 000 016, однако, как только я введу 2 миллиарда, мой результат отобразится как -589934592, несмотря на правильный ответ, показанный в $ t8, и $ t9 ($ t8 = 0x00000001 и $ t9 = 0xdcd65010)
Следует отметить, что в настоящее время у меня отображается 3 результата, сначала результат A B, затем C D и, наконец ((A B) + (C D)). Независимо от того, когда я введу 2 миллиарда, все мои результаты будут отображаться как -589934592, поэтому, если я не введу 2 миллиарда до C или D, мой результат для A * B будет правильным, но после этого я не знаю, что случается.
.data
A: .word # Integer A
B: .word # Integer B
C: .word # Integer C
D: .word # Integer D
S: .word # Integer S to store high 32 bits of result
S1: .word # Integer S1 to store low 32 bits of result
newline: .asciiz "\n" #To make output look better
Prompt1: .asciiz "Please enter first number A: "
Prompt2: .asciiz "Please enter second number B: "
Prompt3: .asciiz "Please enter third number C: "
Prompt4: .asciiz "Please enter fourth number D: "
Result: .asciiz "The result of ((A * B) + (C * D)) : "
Partial: .asciiz "The result of (A * B) "
Partial2: .asciiz "The result of (C * D) "
.text
main:
#Prompt for integers A
li $v0, 4 # Load instruction for printing the string
la $a0, Prompt1 # Load Prompt1 into $a0
syscall
#Read first integer
li $v0, 5 # Read first integer A
la $t0, A # $t0 = A
syscall
#Store first integer A into the memory
move $t0, $v0 # Move contents in $v0 to $t1
sw $t0, A # V = value at $t1
##Prompt for integers B
li $v0, 4 # Load instruction for printing the string
la $a0, Prompt2 # Load prompt2 into $a0
syscall
#Read second integer
li $v0, 5 # Read second integer
la $t1, B # $t1 = B
syscall
#Store second integer into memory
move $t1, $v0 # Move contents in $v0 to $t1
sw $t1, B # B = value at $t1
#Multiply the two variables A and B and store it in S
la $t2, S # $t2 = S
mult $t0, $t1 # A * B
mfhi $t8 # hold high 32-bits of A*B
mflo $t9 # hold low 32-bits of A*B
sw $t8, S # S = value at $t8
sw $t9, S1 # S1 = value at $t9
#Display the Result prompt
la $a0, Partial # Loads Output label to be printed
li $v0, 4 # Sysycall to print string "The result of A*B"
syscall
#Display the result
lw $a0, S # $a0 = value at S
li $v0, 1 # Syscall to print integer
lw $a0, S1 # $a0 = value at S1
li $v0, 1 # Syscall to print integer
syscall
#New line
la $a0, newline
addi $v0, $0, 4
syscall
#Prompt for integers C
li $v0, 4 # Load instruction for printing the string
la $a0, Prompt3 # Load Prompt3 into $a0
syscall
#Read third integer
li $v0, 5 # Read third integer C
la $t0, C # $t0 = C
syscall
#Store third integer C into the memory
move $t0, $v0 # Move contents in $v0 to $t0
sw $t0, C # C = value at $t0
##Prompt for integers D
li $v0, 4 # Load instruction for printing the string
la $a0, Prompt4 # Load prompt4 into $a0
syscall
#Read second integer
li $v0, 5 # Read fourth integerD
la $t1, D # $t1 = D
syscall
#Store second integer into memory
move $t1, $v0 # Move contents in $v0 to $t1
sw $t1, D # D = value at $t1
#Multiply the two variables C and D and store it in S
la $t2, S # $t2 = S
mult $t0, $t1 # C * D
mfhi $t2 # holds high 32-bits of C*D
mflo $t3 # holds low 32-bits of C*D
#Store new C*D values in S and S1 (A*B are in S and S1 but also in $8 and $t9)
sw $t2, S
sw $t3, S1
#Display the Result prompt
la $a0, Partial2 # Loads Output label to be printed "Result of C*D"
li $v0, 4 # Sysycall to print string
syscall
#Display the result
lw $a0, S # $a0 = value at S
li $v0, 1 # Syscall to print integer
lw $a0, S1
li $v0, 1
syscall
#New line
la $a0, newline
addi $v0, $0, 4
syscall
#Add partial results
add $t8, $t8, $t2 # Add high values of A*B = $t8 and high values of C*D = $t2 and store in $t8
add $t9, $t9, $t3 # Add low values of A*B = $t9 and low of values of C*D= $t3
sw $t8, S # load high values of addition in $t8
sw $t9, S1 # load low values of addition in $t9
#New line
la $a0, newline
addi $v0, $0, 4
syscall
#Display the Result prompt
la $a0, Result # Loads Output label to be printed "Final result"
li $v0, 4 # Sysycall to print string
syscall
#Display results
lw $a0, S #set up to print addition results
li $v0, 1
lw $a0, S1
li $v0, 1
syscall
#Exit the program
li $v0, 10 # Load exit code to $v0
syscall
# At this point I am pulling the correct solution - and displaying correct answers when
numbers are small
# but when numbers are bigger (such as (2b*4)+(4*4)) I am getting the right answer but not
displaying it right
# 64-bit representation of complex example above is being seperated correctly into $t8 and
$t9 but no showing right
# $t8 = 0x00000001 and $t9 = 0xdcd65010 so together 0x00000001dcd65010 which is
8,000,000,016 but the all the displays
# after 2b is entered is -589934592 despite the correct answer being held in $t8 and $t9
Я уверен, что мой код беспорядок, но это моя первая попытка написать в MIPS, я просто не понимаю, почему я получаю правильное решение в $ t8 и $ t9, но я не отображать это правильно. Я ценю любые отзывы или идеи, которые я получаю, и благодарю всех за чтение этого длинного поста.