我有一个3D数组,我想处理说c[l][i][k]
..
16(%ebp)
-24(%ebp)
-20(%ebp)
-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)
c[l][i][k]
?movl %edx, (%ecx,%eax,4)
行在做什么?答案 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
的第一个参数。