-1

我开始在 MIPS ASSEMBLY 中编程。我需要完成这个例子,但我不明白为什么打印错误的结果:

对不起,如果不是所有评论都是英文的,但我是意大利人,我没有时间;)

.text #Abilita gli input/output di testo

main:                              # la funzione main è sempre chiamata in qualsiasi programma mips, qui parte il programma
    la $a0 , main_program_string   #Carico in memoria l'indirizzo della stringa main_program_string e la memorizzo nell' argument register 0
    li $v0 , 4                     # Carico il valore 4 nel registro $v0 che è il codice operatore per il print delle stringhe
    syscall                        #leggo il registro $v0 vrfr 4 e printa la stringa 

    la $a0 , first_number_string   #Carico in memoria l'indirizzo della stringa first_number_string e la memorizzo nell' argument register 0
    li $v0 , 4                     # Carico il valore 4 nel registro $v0 che è il codice operatore per il print delle stringhe
    syscall                        #leggo il registro $v0 vrfr 4 e printa la stringa 

    li $v0, 5                      # load syscall read_int into $v0
    syscall                        # make the syscall
    move $t0, $v0                  # move the number read into $t1



    la $a0 , second_number_string   #Carico in memoria l'indirizzo della stringa first_number_string e la memorizzo nell' argument register 0
    li $v0 , 4                     # Carico il valore 4 nel registro $v0 che è il codice operatore per il print delle stringhe
    syscall                        #leggo il registro $v0 vrfr 4 e printa la stringa 

    li $v0, 5                      # load syscall read_int into $v0
    syscall                        # make the syscall
    move $t1, $v0                  # move the number read into $t1

    la $a0 , third_number_string   #Carico in memoria l'indirizzo della stringa first_number_string e la memorizzo nell' argument register 0
    li $v0 , 4                     # Carico il valore 4 nel registro $v0 che è il codice operatore per il print delle stringhe
    syscall                        #leggo il registro $v0 vrfr 4 e printa la stringa 

    li $v0, 5                      # load syscall read_int into $v0
    syscall                        # make the syscall
    move $t2, $v0                  # move the number read into $t1


    bge $t1 ,$t0 , MAXA
    j MAXC

MAXA : 
    bge $t2,$t1,MAXB1
    add $t3 , $t0 , $t2
    j DONE
MAXB1 : 
    add $t3 , $t0 , $t1
    j DONE
MAXC : 
    bge $t2,$t0,MAXC1
    add $t3 , $t1 , $t2
    j DONE
MAXC1 : 
    add $t3 , $t0 , $t1
    j DONE

DONE : 
    la $a0 , response_string   #Carico in memoria l'indirizzo della stringa first_number_string e la memorizzo nell' argument register 0
    li $v0 , 4                     # Carico il valore 4 nel registro $v0 che è il codice operatore per il print delle stringhe
    syscall                        #leggo il registro $v0 vrfr 4 e printa la stringa 

    li $v0, 1 # load system call (print integer) into syscall register
    move $a0, $t3 # load argument for syscall
    syscall # print element
end: jr $ra 



.data # indica al processore che gli vengono passati dei dati


main_program_string:
    .asciiz "Il programma ti permette di inserire 3 numeri interi e ottenere la somma dei due maggiori\n"

first_number_string:
    .asciiz "Inserire il primo numero intero\n"

second_number_string:
    .asciiz "Inserire il secondo numero intero\n"

third_number_string:
    .asciiz "Inserire il terzo ed ultimo numero intero\n"

response_string:
    .asciiz "\nIl valore della somma dei due numeri maggiori è pari a : "
4

1 回答 1

1

你的逻辑不正确,我建议你再看一遍。

例如,考虑一下您将如何在第一次添加(即add $t3 , $t0 , $t2)处结束:

bge $t1 ,$t0 , MAXA将不得不采取,所以$t1 >= $t0
bge $t2,$t1,MAXB1将不得不被采取,所以$t1 > $t2.

这些条件将是真实的,例如对于输入$t0=1, $t1=3, $t2=2。人们期望的结果是5( 3 + 2),即$t1 + $t2。但是您的程序将产生的结果是3$t0 + $t2== 1 + 2)。

于 2013-05-24T06:07:21.150 回答