0

私は3D配列を持っていて、say c[l][i][k]..の値を扱いたい.

  • cは場所にあります16(%ebp)
  • 私はいる-24(%ebp)
  • 私はいる-20(%ebp)
  • kが入っています-12(%ebp)

配列サイズは[20][20][20]

このアセンブリ コードは次のとおりです。

movl    -24(%ebp), %eax          #eax <-- l
imull   $1600, %eax, %eax        #eax <--1600*l 
movl    %eax, %ecx               #ecx <--1600*l
addl    16(%ebp), %ecx           #ecx <--1600*l + c 
movl    -20(%ebp), %edx          #edx <-- i
movl    %edx, %eax               #eax <-- i
sall    $2, %eax                
addl    %edx, %eax              
sall    $2, %eax            
addl    -12(%ebp), %eax             
movl    -8(%ebp), %edx              
movl    %edx, (%ecx,%eax,4)
  1. ここにある各アセンブリ コード行の意味は何ですか?
  2. 実際に値を取得するにはどうすればよいc[l][i][k]でしょうか。
  3. また、ラインは何をしmovl %edx, (%ecx,%eax,4)ていますか?
4

1 に答える 1

2

その配列は、連続した一連の20 * 20 * 20 * (size of one element)バイトとして表されます。この配列内の要素のアドレスは[l][i][k]、次のように計算できます。

   l * 20 * 20 * size of one element
 + i * 20 * size of one element
 + k * size of one element

乗算1600 * lは、最初のステップl * 20 * 20 * (size of one element)であるバイトを実行します (これは、サイズが 4 バイトであることを示唆しています)。

コメントしていない行は compute(((i << 2) + i) << 2) + kです。これは基本的20 * i + kに、2 番目と 3 番目のステップを組み合わせたもので、要素サイズによる乗算はありません。( sallC のビットごとのシフトと同じ「左シフト」です。)

この欠けている乗算は最後の行で行われます: (必要なアドレス) をmovl %edx (%ecx, %eax, 4)計算し、そのアドレスecx + eax * 4に の値を入れedxます。

あなたの質問が示唆するように、このコードは配列から読み取っているのではなく、配列に書き込んでいるように見えることに注意してください。配列からその要素を読み取るmovlには、括弧で囲まれた式を の最初の引数として使用する必要があります。

于 2012-07-29T08:44:44.403 に答える