1

long (サイズ 4) の配列があり、これら 4 つの値のそれぞれを個別のレジスタに格納したいと考えています。しかし、アセンブリで配列を操作したことがないため、これを行う方法がわかりません。たとえば、 、 などに保存したいのですが、誰かarray[0]がこれを行うのを手伝ってくれますか? これまでの私のコードは次のとおりです。配列へのポインタです。r9array[1]r10lhs

define(lhs,%rdi)
define(rhs_d,%esi)
define(rhs,%rsi)
define(result,%rdx)

.text


.globl addBignumInt
    .type   addBignumInt, @function
addBignumInt:
.LFB18:
    .cfi_startproc
    # code goes here
    movslq  rhs_d, rhs

    .cfi_endproc
.LFE18:
    .size   addBignumInt, .-addBignumInt

だから、本質的に私がやりたいことはです movq lhs[0], %r9 が、明らかにこれは正しくありません

4

1 に答える 1

0

配列を指すポインター (その先頭) を、それが保持する sizeof(type) の n 倍オフセットする必要があります。

したがって、次のようにします。

mov rax, arrBegin ; rax points to the array of longs

次に、次の例では 2 番目の要素を rbx に格納します。

mov rbx, [rax + 4]

または、n 番目の要素にアクセスする場合 (宛先レジスタを常に変更する場合は、手動で展開する必要がありますが、おそらくループ内にあります)、次のようにします。

疑似コード (これは好きなように行うことができます。乗算加算アドレッシング モードまたはヘルパー レジスタを使用します):

mov dest, [rax + n * 4]  

ここで、n はヘルパーまたは scale{2, 4, 8} (アドレッシング モードの一部) です。

于 2013-11-10T17:28:20.880 に答える