汇编语言 - 堆栈帧中的3d数组排列

时间:2012-07-29 08:20:44

标签: assembly x86

我有一个3D数组,我想处理说c[l][i][k] ..

的值
  • c位于16(%ebp)
  • 位置
  • l在-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)行在做什么?

1 个答案:

答案 0 :(得分: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个字节)。

你没有评论的行计算(((i << 2) + i) << 2) + k,基本上是20 * i + k - 第二步和第三步合并,没有按元素大小的乘法。 (sall是“向左移”,与C的按位移位相同。)

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

请注意,此代码似乎正在写入到数组中,而不是从中读取,就像您的问题所示。要从数组中读取该元素,您应该使用该括号表达式作为movl的第一个参数。