MIPS - 通过与值表进行比较来加载值

时间:2013-03-29 04:46:37

标签: operators compare add mips

SO用户,

我希望有人可以就如何解决这个问题分享他们的想法。 可以说,我有一张价值表。该表包含两列,第一列(COL1)具有与之关联的特定值,第二列(COL2)具有另一列:

值均为十六进制

COL1    COL2
 0       11
 1       90
 2       52
 3       C8
 4       B7

现在,我要做的是,比较其中一个寄存器中的值,如果它与COL1中的任何值匹配,我必须加载另一个带有COL2相应值的寄存器。例如,如果我有一个值,比如R2 = 1,我将不得不加载R3为90。

我正在使用的方法涉及完全避免lb指令(我的目标);

and $r1, $r1, $r0    #Initialise r1 to 0
addi $r1, $r1, 1     #load r1 with 1
beq $r2, $r1, LOAD_1 #Check to see if r2 = 1

and $r1, $r1, $r0
addi $r1, $r1, 2
beq $r2, $r1, LOAD_2

LOAD_1: 
and $r3, $r3, $zero
addi $r3, $r3, 0x52  #Load r3 with 0x52 as per the table

LOAD_2:
Load value into r3 as before.

这个问题是,如果我有一张巨大的桌子,它会变得非常漫长。如果有一个(使用lb运算符),有人可以建议更短的方式吗?

1 个答案:

答案 0 :(得分:1)

如果COL1序列已排序,您可以执行binary search以快速找到给定值。

如果序列按升序排序且没有任何间隙或重复(即 x:th 元素总是等于 x-1:th 元素加1)它变得更容易:

if (R2 >= COL1[0] && R2 <= COL1[last_index]) {
    R3 = COL2[R2 - COL1[0]];
}