MIPS组件中的开关盒

时间:2019-02-27 01:27:58

标签: assembly mips

我曾尝试在MIPS汇编中实现开关盒,但是我觉得我可以使它更简单,尤其是在使用默认盒的情况下。无论如何,我可以做得更好吗? 这是我的汇编代码:

$t1 = var
$t2 = i 
$t3 = 4
$t4 = 1

lw $t1,0($i)
lw $t2, 0($var)

li $t3, 4                                #load intermediate value of 4 into $t3
li $t4, 1                                #load intermediate value of 1 into #t4
lui $t5, 0xFFFF
li $t6, 0x2000A0000

bltz $t1, DEFAULT_BODY #branch to default if var less than 0 
slt $s0, $t1, $t3                   # if t1 < t3, then $s0 = 1, otherwise 0
beq $s0, $t4, DEFAULT_BODY  #if $s0=1 then branch to default
j C0_COND


C0_COND: addi $t1, $zero, 0   # case 0: set var to 0 
            beq $t1, $t1, C0_BODY
                    j C1_COND

C1_COND: addi $t1, $zero, 1
                   beq $t1, $t1, C1_BODY
           j C2_COND

C2_COND: addi $t1, $zero, 2
                   beq $t1, $t1, C2_BODY
           j END

C0_BODY: sub $t2, $t2, $t4
                   j END
C1_BODY: addi $t2, $t2, 5 
                   j END
C2_BODY: addi $t1, $zero, 0xFFFF0000
           j END


DEFAULT_BODY: addi $t1, $zero, $t5
              j END
END: sw $t7, $t6

这是我与

进行比较的C代码
char i;
int var;
// ...
switch (var) {
case 0:
    i--;
    break;
case 1:
    i += 5;
    break;
case 2:
    i = 0xFFFF0000;
    break;
default:
    i = 0;
}

谢谢。

1 个答案:

答案 0 :(得分:0)

跳转到无论如何将自动执行的下一条指令是没有意义的。您使用了beq $t1, $t1 3次,但这始终是正确的。你肯定打错了。建议您在尝试对其进行优化之前,先确保您的代码正常运行。

为简化起见,您可以使用以下方式重写代码:

i--;
if (var == 0) goto done;
i += 6;  /* account for the i-- above */
if (var == 1) goto done;
i = 0xFFFF0000;
if (var == 2) goto done;
i = 0;
done: