[编辑]
有人可以通过对应的汇编代码的每一行来向我解释我们如何获得M和N的值吗?

我总是对movl array2部分感到困惑。

M和N是使用#define定义的常数

#define M <some value>
#define N <some value>

int array1[M][N];
int array2[N][M];
int copy(int i, int j)
{
array1[i][j] = array2[j][i];
}


如果以上代码生成以下汇编代码:我们如何推导常量M和N的值?

  copy:
    pushl %ebp
    movl %esp, %ebp
    pushl %ebx
    movl 8(%ebp), %ecx
    movl 12(%ebp), %ebx
    leal (%ecx, %ecx, 8), %edx
    sall $2, %edx
    movl %ebx, %eax
    sall $4, %eax
    subl %ebx, %eax
    sall $2, %eax
    movl array2(%eax, %ecx, 4), %eax
    movl %eax, array1(%edx, %ebx, 4)
    popl %ebx
    movl %ebp,%esp
    popl %ebp
    ret

最佳答案

您需要检查装配的其他零件。例如,如果将M和N都定义为8,则在程序集中将找到以下内容

array1:
    .zero   256
array2:
    .zero   256


因为在我的机器上,int是4个字节,而8乘以8是64。并且64 * 4 =256。可以在here中找到示例程序集。

关于c - 在C中反汇编IA32 32位AT&T函数的汇编代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46778072/

10-11 15:13