输入三个数字返回两个主要的总和

时间:2013-05-23 22:20:24

标签: assembly sum max mips system-calls

我开始在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 : "

1 个答案:

答案 0 :(得分:1)

你的逻辑是错误的,我建议你再次检查它。

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

bge $t1 ,$t0 , MAXA必须采取,$t1 >= $t0 bge $t2,$t1,MAXB1必须,所以$t1 > $t2

这些条件是正确的,例如对于输入$t0=1$t1=3$t2=2。人们期望的结果是53 + 2),即$t1 + $t2。但是,您的计划产生的结果是3$t0 + $t2 == 1 + 2)。