我开始在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 : "
答案 0 :(得分: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
)。