0

仲間の SO ユーザー、

この問題を解決する方法について、誰かがアイデアを共有できることを願っています。たとえば、値のテーブルがあるとします。テーブルには 2 つの列が含まれています。最初の列 (COL1) には特定の値が関連付けられており、2 番目の列 (COL2) には別の値が含まれています。

値はすべて 16 進数です

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

ここで、レジスタの 1 つの値を比較し、それが 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(演算子を使用して)存在する場合、誰かがより短い方法を提案してもらえますか?

4

1 に答える 1

1

COL1シーケンスがソートされている場合は、バイナリ検索を実行して、指定された値をすばやく見つけることができます。

シーケンスが両方とも昇順でソートされていて、ギャップや重複がない場合 (つまり、x: 番目の要素は常にx-1: 番目の要素に 1 を加えた値に等しい)、さらに簡単になります。

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