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
运算符),有人可以建议更短的方式吗?
答案 0 :(得分:1)
如果COL1
序列已排序,您可以执行binary search以快速找到给定值。
如果序列按升序排序且没有任何间隙或重复(即 x:th 元素总是等于 x-1:th 元素加1)它变得更容易:
if (R2 >= COL1[0] && R2 <= COL1[last_index]) {
R3 = COL2[R2 - COL1[0]];
}