[编辑]
有人可以通过对应的汇编代码的每一行来向我解释我们如何获得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/