Я попытался реализовать случай коммутатора в сборке 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;
}
Спасибо.