Корпус коммутатора в сборке MIPS - PullRequest
0 голосов
/ 27 февраля 2019

Я попытался реализовать случай коммутатора в сборке 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 голосов
/ 27 февраля 2019

Переход к следующей инструкции, которая в любом случае будет выполнена автоматически, не имеет смысла.Вы использовали beq $t1, $t1 три раза, но это, конечно, всегда так.Конечно, вы сделали опечатку.Я предлагаю вам убедиться, что ваш код работает правильно, прежде чем пытаться оптимизировать его.

Что касается упрощения, вы можете переписать код в виде сбоя, как:

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:
...