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-第二步和第三步相结合,没有乘以元素大小。(sall是“左移”,与 C 的按位移位相同。)

这个缺失的乘法由最后一行完成:movl %edx (%ecx, %eax, 4)计算ecx + eax * 4(我们想要的地址)并将值edx放入该地址。

请注意,正如您的问题所暗示的那样,此代码似乎正在写入数组,而不是从中读取。要从数组中读取该元素,您应该使用带括号的表达式作为movl.

于 2012-07-29T08:44:44.403 回答