Показать 64-битное целое число в MIPS - PullRequest
0 голосов
/ 13 февраля 2020

Я использую 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, но я не отображать это правильно. Я ценю любые отзывы или идеи, которые я получаю, и благодарю всех за чтение этого длинного поста.

...