gpt4 book ai didi

c - 无法确定此汇编代码中的常量

转载 作者:太空狗 更新时间:2023-10-29 14:59:02 25 4
gpt4 key购买 nike

考虑以下源代码,其中 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 的常量。

我不期待答案,但任何能给我指明正确方向的提示都将不胜感激

最佳答案

赠品是:i * 111 = i * 3 * 37 .早些时候,2 个 LEA 指令组合在一起设置 eax = 37 * j .添加k总结:eax = 3 * 37 * i + 37 * j + k .自 int为4字节,数组大小为888字节,数组有222个元素。数组维度是素数的排序:{2,3,37}

展开:

edx <- j
eax <- edx + 8 * edx = 9.j
eax <- edx + 4 * eax = j + 4 * 9j = 37.j

edx <- i * 111 = 3 * 37.i
eax <- eax + edx = 3 * 37.i + 37.j
eax <- eax + k = 3 * 37.i + 37.j + k

很明显,(i == 2)把我们放在元素A[222] ,超出范围。所以假设 (i,j,k)对应(R,S,T) ,我们有:R = 2 ,其中:(i < 2)

同样,(j == 36)产生至少 (36 * 37 = 1332) 的索引,所以它必须对应于素数:S = 3 ,其中:(j < 3) - 留下:T = 37 ,其中:(k < 37) .

因此我们有数组:A[2][3][37] ,其中:(i < 2, j < 3, k < 37)

一般来说索引是:((((i * S) + j) * T) + k) ,其中:(i < R, j < S, k < T)

关于c - 无法确定此汇编代码中的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21696306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com