【发布时间】:2014-02-11 08:06:16
【问题描述】:
考虑以下源代码,其中 R、S 和 T 是用#define 声明的常量:
int A[R][S][T];
int store_ele(int i, int j, int k, int *dest)
{
*dest = A[i][j][k];
return sizeof(A);
}
在编译这个程序时,GCC 生成如下汇编代码:
i at %ebp+8, j at %ebp+12, k at %ebp+16, dest at %ebp+20
1. movl 12(%ebp), %edx //move j into register %edx
2. leal (%edx, %edx, 8), %eax //move address %edx+%edx*9 into %eax
3. leal (%edx, %eax, 4), %eax //move address %edx + %eax*4 into %eax
4. imull $111, 8(%ebp), %edx //111*i goes into %edx
5. addl %edx, %eax
6. addl 16(%ebp), %eax //add k to %eax
7. movl A(, %eax, 4), %edx //%eax*4 offset by address of A moved into %edx
8. movl 20(%ebp), %eax
9. movl %edx, (%eax)
10. movl $888, %eax
我知道最后一条指令 'movl $888, %eax' 表示有 888 个字节,相当于 222 个整数 (i * j * k)。如您所见,我知道每条指令在做什么,但我很难对其进行逆向工程以确定传递给 i、j 和 k 的常数。
我不期待答案,但任何能指出我正确方向的提示将不胜感激
【问题讨论】:
-
你用的是哪个版本?
-
在查看了更多代码之后,我能够确定 %edx 经历了一堆算术,然后在指令 9 %edx 被移动作为对 %eax 的取消引用(它被设置为A当时的地址)。另外,感谢编辑我的帖子以适应适当格式的人,我是这个网站的菜鸟。
-
不,我是说 gcc 的版本
-
它在虚拟机上,所以我现在登录并检查...gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)