问题。编写MIPS汇编代码,它等同于以下Java代码片段。
int x = 1 ;
int y = 3 ;
int c = 2 ;
x = y - c ;
if (x != y) { x = y + 5 ; }
else { x = c ; } ;
这就是我现在所拥有的。
.data
X: .word 1
Y: .word 3
C: .word 2
.text
main:
la $t1, X
la $t2, Y
la $t3, C
lw $t1, ($t1)
lw $t2, ($t2)
lw $t3, ($t3)
sub $t1, $t2, $t3
li $v0, 1
beq $t1, $t2, iflabel
add $t1,$t3, 0 # sets x = c by adding zero to c and putting result in $t1 (register for x) used.
iflabel: add $t1,$t2,5
syscall
li $v0, 10
据我所知,'8'应该打印,但是0是?!?,不是作业问题,只是关于MIPS的一些修订问题。我可以猜测我的系统调用可能在错误的位置并可能导致错误?我正在使用MARS编程,因为我可以看到寄存器的内容并逐个运行每一行,但仍然对我的问题没有帮助。
答案 0 :(得分:1)
你的条件是倒退的:现在你已经拥有它,所以X 等于 Y它会加5,但是从Java代码看起来你想要它反过来:
bne $t1, $t2, iflabel
其次,你的+5代码流入另一个条件。在if / else块之后需要一个标签,并且在处理if-true代码之后需要转移到它。
第三,你应该在进行系统调用之前立即加载$v0
向量,之后没有理由这样做。
第四,syscall 1需要整数在$a0.
您可以直接将Y + 5或C + 0添加到$a0
。
最终代码应为:
.data
X: .word 1
Y: .word 3
C: .word 2
.text
main:
la $t1, X
la $t2, Y
la $t3, C
lw $t1, ($t1)
lw $t2, ($t2)
lw $t3, ($t3)
sub $t1, $t2, $t3
bne $t1, $t2, iflabel
add $a0,$t3, 0
b endif
iflabel: add $a0,$t2,5
endif:
li $v0, 1
syscall
答案 1 :(得分:0)
你的整数是否在正确的寄存器中?从here看来它应该在$a0