0

SO用户,

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

这些值都是十六进制的

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

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

我使用的方法涉及完全避免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操作员),有人可以建议一种更短的方法吗?

4

1 回答 1

1

如果COL1序列已排序,您可以执行二进制搜索以快速找到给定值。

如果序列都按升序排序并且没有任何间隙或重复(即第x:th元素始终等于第x-1:th元素加 1),则变得更加容易:

if (R2 >= COL1[0] && R2 <= COL1[last_index]) {
    R3 = COL2[R2 - COL1[0]];
}
于 2013-03-29T08:09:24.180 回答