Assembly 减法值重复两次

Assembly 减法值重复两次,assembly,mips,mars-simulator,Assembly,Mips,Mars Simulator,我有一个测验代码,最后给出正确答案和错误答案的数量。为了计算不正确的问题,我用正确的问题减去问题总数。但在输出中,错误答案的数量会重复两次 我无法在代码中找到错误,即使我单步通过调试器。 我在火星上运行这个 .data Q1: .asciiz "Q1) What is the capital of Odisha?\n1) Chennai\n2) Bhubaneswar\n3) Cuttack\n4) Delhi\nAnswer:" Q2: .asciiz &q

我有一个测验代码,最后给出正确答案和错误答案的数量。为了计算不正确的问题,我用正确的问题减去问题总数。但在输出中,错误答案的数量会重复两次

我无法在代码中找到错误,即使我单步通过调试器。 我在火星上运行这个

.data
    Q1: .asciiz "Q1) What is the capital of Odisha?\n1) Chennai\n2) Bhubaneswar\n3) Cuttack\n4) Delhi\nAnswer:"
    Q2: .asciiz "Q2) What is the capital of India?\n1) New York\n2) Bhopal\n3) Chennai\n4) Delhi\nAnswer:"
    Q3: .asciiz "Q3) How many legs do cats have?\n1) Two\n2) Four\n3) Three\n4) Nine\nAnswer:"
    Q4: .asciiz "Q4) Which of the following is a Vegetable?\n1) Water\n2) Orange\n3) Lemon\n4) Carrot\nAnswer:"
    Q5: .asciiz "Q5) Which of the following is a gaming company?\n1) Toyota\n2) Tata\n3) NaughtyDog\n4) RoyalEnfield\nAnswer:"

    CORRECT: .asciiz "\n\n[SCOREBOARD]\n\nCorrect Answers: "
    WRONG: .asciiz "\nIncorrect Answers: "
    
    gameover: .asciiz "\n\nGame Over"
    continue: .asciiz "\n\nVery Good!"

.text
.globl main
main:
    la $a0, Q1      ## Question 1
    li $v0, 4
    li $t0, 0
    syscall 
    
    li $s0, 2       ## Answer of Q1 
    li $v0, 5
    syscall
    
    move $t1, $v0       ## Moving input to $t0 
    bne $t1, $s0, NEXT1
    addi $t0, $t0, 1

NEXT1:
    la $a0, Q2      ## Question 2
    li $v0, 4
    syscall
    
    li $s1, 4       ## Answer of Q2     
    li $v0, 5
    syscall
    
    move $t2, $v0       ## Moving input to $t1 
    bne $t2, $s1, NEXT2
    addi $t0, $t0, 1
    
NEXT2:
    la $a0, Q3      ## Question 3
    li $v0, 4
    syscall
    
    li $s2, 2       ## Answer of Q3     
    li $v0, 5
    syscall
    
    move $t3, $v0       ## Moving input to $t2 
    bne $t3, $s2, NEXT3
    addi $t0, $t0, 1

NEXT3:
    la $a0, Q4      ## Question 4
    li $v0, 4
    syscall
    
    li $s3, 4       ## Answer of Q4     
    li $v0, 5
    syscall
    
    move $t4, $v0       ## Moving input to $t3 
    bne $t4, $s3, NEXT4
    addi $t0, $t0, 1

NEXT4:
    la $a0, Q5      ## Question 5
    li $v0, 4
    syscall
    
    li $s4, 3       ## Answer of Q5 
    li $v0, 5
    syscall
    
    move $t5, $v0       ## Moving input to $t3 
    bne $t5, $s4, FINALSCORE
    addi $t0, $t0, 1

    
FINALSCORE:
    la $a0, CORRECT
    li $v0, 4
    syscall
    
    move $a0, $t0
    li $v0, 1
    syscall
    
    la $a0, WRONG
    li $v0, 4
    li $t6, 5
    syscall
    
    sub $t7, $t6, $t0
    move $a0, $t7
    li $v0, 1
    syscall
    
    move $s1, $t0
    syscall

    slt $t4,$s1,$s2      # checks if $s0 > $s1
    beq $t4,1,FINISH     # if $s1 < $s2, goes to label1
    beq $t4,$zero,NIVEL2 # if $s1 > $s2, goes to label3
    beq $s1,$s2,NIVEL2   # if $s1 = $s2, goes to label2 
    
FINISH:
    la $a0, gameover
    li $v0, 4
    syscall
    
    li $v0, 10          ##END OF CODE :)
    syscall

NIVEL2:
    la $a0, continue
    li $v0, 4
    syscall
    
    li $v0, 10          ##END OF CODE :)
    syscall
.data
Q1:“Q1)奥迪沙的首都是什么?\n1)钦奈\n2)布巴内斯瓦尔\n3)卡塔克\n4)德里\n华盛顿:
问题2:。asciiz“问题2)印度的首都是什么?\n1)纽约\n2)博帕尔\n3)钦奈\n4)德里\n电力:
Q3:.asciiz“Q3)猫有几条腿?\n1)两条\n2)四条\n3)三条\n4)九条\n答案:
Q4:.asciiz“Q4)以下哪项是蔬菜?\n1)水\n2)橘子\n3)柠檬\n4)胡萝卜\n水:
问题5:.asciiz“Q5)以下哪家是游戏公司?\n1)丰田\n2)塔塔\n3)诺蒂多格\n4)罗亚伦菲尔德\n电源:
正确:.asciiz“\n\n[记分板]\n\n正确答案:
错误:.asciiz“\n错误答案:”
游戏结束:.asciiz“\n\n游戏结束”
继续:.asciiz“\n\n检查是否正常!”
文本
格洛博梅因酒店
主要内容:
la$a0,第一季度##问题1
李$v0,4
李$t0,0
系统调用
li$s0,2##Q1的答案
李$v0,5
系统调用
移动$t1、$v0##将输入移动到$t0
bne$t1、$s0、NEXT1
addi$t0,$t0,1
下一步1:
la$a0,第2季度##问题2
李$v0,4
系统调用
li$s1,4##Q2的答案
李$v0,5
系统调用
移动$t2、$v0##将输入移动到$t1
bne$t2,$s1,NEXT2
addi$t0,$t0,1
下一步2:
la$a0,第三季度##问题3
李$v0,4
系统调用
li$s2,2#第三季度答案
李$v0,5
系统调用
移动$t3、$v0##将输入移动到$t2
bne$t3、$s2、NEXT3
addi$t0,$t0,1
下一步3:
la$a0,第4季度##问题4
李$v0,4
系统调用
李$s3,第四季度第四季度答案
李$v0,5
系统调用
移动$t4、$v0##将输入移动到$t3
bne$t4、$s3、NEXT4
addi$t0,$t0,1
下一步4:
la$a0,Q5##问题5
李$v0,4
系统调用
李$s4,3##问题5的答案
李$v0,5
系统调用
移动$t5、$v0##将输入移动到$t3
bne$t5,$s4,最终核心
addi$t0,$t0,1
最终核心:
la$a0,对吗
李$v0,4
系统调用
移动$a0,$t0
李$v0,1
系统调用
洛杉矶a0美元,错了
李$v0,4
李$t6,5
系统调用
低于$t7、$t6、$t0
移动$a0,$t7
李$v0,1
系统调用
移动$s1,$t0
系统调用
slt$t4、$s1、$s2#检查$s0是否大于$s1
beq$t4,1,完成#如果$s1<$s2,则进入标签1
beq$t4,$zero,NIVEL2#如果$s1>s2,则转到标签3
beq$s1,$s2,NIVEL2#如果$s1=$s2,则转到label2
完成:
洛杉矶$a0,加油
李$v0,4
系统调用
li$v0,10##代码结束:)
系统调用
NIVEL2:
la$a0,继续
李$v0,4
系统调用
li$v0,10##代码结束:)
系统调用

在打印错误答案的片段中,函数1有第二个系统调用:

la $a0, WRONG
li $v0, 4
li $t6, 5
syscall

sub $t7, $t6, $t0
move $a0, $t7
li $v0, 1
syscall            <- this prints the # of wrongs

move $s1, $t0
syscall            <- this prints the # of wrongs again, since $v0 is still 1
la$a0,错误
李$v0,4
李$t6,5
系统调用
低于$t7、$t6、$t0
移动$a0,$t7
李$v0,1

不过,系统调用应该是单步执行的。而且,在系统调用期间依赖$t寄存器保持不变也不是一个好主意。-你为什么这么说?我很确定这在火星上是有保证的,在Linux MIPS上也是有保证的。系统调用与大多数ISA(包括MIPS)上的函数调用使用不同的调用约定,除返回值外,所有寄存器都保留syscall是正常的。我们不确定syscall约定。哦,好吧,我把它收回去。