将C ++翻译为MIPS程序集

时间:2014-02-20 07:57:30

标签: c++ assembly mips

我需要帮助解决这个问题的最后一部分。我基本上试图将C ++代码翻译成MIPS汇编语言。

假设a为$ s0,b为$ s1,c为$ s2,x为$ s4,y为$ s5,z为$ s6。

我几乎完成了所有这些,但我仍然坚持这两个,我知道它的一些部分,但我很难将它整体放在一起。我知道的部分后面跟着汇编代码的主题标签。谢谢你的帮助。

1

for(x = 0; x <= z; x++) # x = 0; is: addi $s4, $0, 0
y = y + 1; # addi $s5, $s5, 1
y = 0; # addi $s5, $0, 0

2

if(y > z)
x = 0; # addi $s4, $0, 0
else x = 1; # else: addi $s4, $0, 1

以下是没有主题标签的oringinal问题,因为我错了:

1

for(x = 0; x <= z; x++) 
y = y + 1; 
y = 0; 

2

if(y > z) 
x = 0; 
else x = 1; 

再次感谢。

尝试2,不确定是否正确。

ifLoop:

add $s5, ? , $s6
addi $s4, $0, 0

ifLoop

else:

addi $s4, $0, 1

else

练习:(假设数组p在$ s7中)

p[0] = 0; 
int a = 2; 
p[1] = a; 
p[a] = a;     

我的尝试:

sw $0, 0($s7) 
addiu $s0, $0, 2 
sw $s0, 4($s7) 
sll $t0, $s0, 2 
addu $t1, $t0, $s7 
sw $s0, 0($t1)            

1 个答案:

答案 0 :(得分:1)

编辑:1。幸运的是,没有伪指令,它没有太大的不同。

addi $s4, $0, 0

forLoop: sle $t1, $s4, $s6  #if x <= z, set $t1 to 1, else 0
         addi $s5, $s5, 1
         addi $s5, $0, 0
         addi $s4, $s4 1
         bne $t1, $0, forLoop #repeat loop while $t1 is not 0

这是#2。在我给出答案之前,我只是想让你试一试。您想使用slt指令将寄存器设置为1或0.如果为1,则比较为真(y> z)。然后使用bne确定跳转到的位置。通过将bne与0进行比较,真正的代码最终直接位于bne指令之下。对于else,跳转到标签。

slt $t2, $s6, $s5 # if z < y, set $t2 to 1, else 0
bne $t2, $0, else # if $t2==1, do the code below, if not, go to else

        addi $s4, $0, 0
        j continue    # need the jump instruction to skip the else below
else: 
        addi $s4, $0, 1

continue:
        # rest of code/program