0

问题。编写与以下 Java 代码片段等效的 MIPS 汇编代码。

    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 的一些修订问题。我可以猜测我的 syscall 可能在错误的地方并且可能导致错误?,我正在使用 MARS 进行编程,因为我可以看到寄存器的内容并逐行运行,但仍然对我的问题没有帮助。

4

2 回答 2

1

你的条件是倒退的:现在你有它,所以 X等于Y 它会加 5,但是从 Java 代码看来你想要它相反:

bne $t1, $t2, iflabel

其次,您的 +5 代码流入另一个条件。在 if/else 块之后需要一个标签,并且在处理 if-true 代码后需要分支到它。

第三,您应该$v0在执行系统调用之前立即加载向量,之后没有理由这样做。

第四,系统调用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
于 2012-04-18T21:55:17.810 回答
0

你的整数在正确的寄存器中吗?从这里看来它应该在$a0

于 2012-04-18T21:47:03.783 回答