我曾尝试在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;
}
谢谢。
答案 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: