MIPS - 修订版将java片段转换为MIPS。制作程序但打印错误号码?

时间:2012-04-18 21:37:57

标签: assembly mips

问题。编写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编程,因为我可以看到寄存器的内容并逐个运行每一行,但仍然对我的问题没有帮助。

2 个答案:

答案 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