2014-01-12 3 views
3

я пытаюсь реализовать переключатель случай в трудоемкости, используя таблицу переходов как массив меток для перехода:Реализовать кожух переключателя в MIPS

.data 
JumpTable: 
    .word L0, L1, L2, L3 

    .text 
    .globl main 
main: 
    la $t4, JumpTable  # address of JumpTable 
    sll $t1, $s5, 2  # s5 is value of the variable witch we want to switch on it. 
    add $t1, $t1, $t4 
    lw $t0, 0($t1) 
    jr $t0 

    L0: 
     ... 
    L1: 
     ... 
    L2: 
     ... 
    L3: 
     ... 

мой вопрос, есть ли способ сделать это для не последовательные переменные? (например, 1,4,19,40)

+0

В этом случае единственный способ сравнить-и-jump –

+0

u предполагает, что нет возможности сделать это с помощью таблицы прыжка? – Branky

+0

да, попробуйте выполнить компиляцию с C и посмотрите на разборку, не все случаи могут использоваться с таблицей переходов. Конечно, вы можете использовать неиспользуемые случаи с адресом для перехода, чтобы вырваться из корпуса, но он будет потреблять память, и не все случаи могут использовать это. Например, как вы можете сделать таблицу перехода для коммутатора с 0, 1, 10000000, 500000000 случаями? –

ответ

2

Вы можете добавить двойников таблицу

.word L0, L0, L0, L0, L1, L2, L2, L2, L2, L2, L2, L3, ... 

ИЛИ

использовать условное разветвление. Это зависит от вашего предполагаемого приложения.

+0

он работает только с маленькими таблицами прыжков, для случаев с большим расстоянием он будет потреблять много памяти и, возможно, вообще не может быть реализован –

+0

Это правда. В этом случае следует использовать условное разветвление. – Patrik

Смежные вопросы