分解IA32 32位AT&;C语言中函数的T汇编代码
[已编辑] 有人能给我解释一下,在这个问题中,我们是如何通过相应的汇编代码的每一行得到M和N的值的吗 我总是被电影里的情节难倒 M和N是使用#define定义的常数分解IA32 32位AT&;C语言中函数的T汇编代码,c,32-bit,disassembly,C,32 Bit,Disassembly,[已编辑] 有人能给我解释一下,在这个问题中,我们是如何通过相应的汇编代码的每一行得到M和N的值的吗 我总是被电影里的情节难倒 M和N是使用#define定义的常数 您需要检查部件的其他零件。例如,如果将M和N都定义为8,则会在程序集中找到以下内容 array1: .zero 256 array2: .zero 256 因为在我的机器上,int是4字节,8乘以8等于64。64*4=256。可以找到示例组件。好了,伙计们,经过大量研究,我终于找到了解决方案。如果我错了,请
您需要检查部件的其他零件。例如,如果将M和N都定义为8,则会在程序集中找到以下内容
array1:
.zero 256
array2:
.zero 256
因为在我的机器上,int是4字节,8乘以8等于64。64*4=256。可以找到示例组件。好了,伙计们,经过大量研究,我终于找到了解决方案。如果我错了,请纠正我 因此,请一步一步地完成以下装配:(为方便起见,添加了行号) M和N是使用#define定义的常数
%ebp
推入堆栈%ebp
指向%esp
%ebx
推入堆栈%ecx
等于int i
(数组访问索引)%ebx
等于int j
(数组访问索引)%edx
等于8*%ecx+%ecx
或9i
%edx
等于36i
左二进制移位2
%eax
等于%ebx或j
%eax
等于16j
左二进制移位4
%eax
等于%eax-%ebx=16j-j=15j
%eax
等于60j
左二进制移位2
%eax
等于具有索引的array2元素[4%ecx+%ebx]或[4i+60j]
[4%ebx+%edx]或[4j+36i]
的元素等于%eax
或[4i+60j]
%ebx
弹出%esp
的旧值已恢复%ebp
弹出array1[i][j]
的元素访问权等于4Ni+4j
而array2[j][i]
的元素访问权等于4Mj+4i
(每个索引项中的4作为int是4个字节,i,j是从起始数组位置的单个偏移量)
这是正确的,因为C以行主形式存储数组
所以我们得到的结果相等,M=15和N=9。你真的希望我们输入所有这些吗?不要发布代码的图片!请修正你的问题。为什么代码是图像???你说“我们得到M和N的值”是什么意思?你是说
i
和j
?#定义M代码>=>不会编译#define指令不能包含在编译过程中,我认为因为我们天生不知道它们的值,汇编代码可能对它们的值有提示。我认为有一种方法可以找到答案,而不必假设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
array1:
.zero 256
array2:
.zero 256
int array1[M][N];
int array2[N][M];
int copy(int i, int j)
{
array1[i][j] = array2[j][i];
}
copy:
1 pushl %ebp
2 movl %esp, %ebp
3 pushl %ebx
4 movl 8(%ebp), %ecx
5 movl 12(%ebp), %ebx
6 leal (%ecx, %ecx, 8), %edx
7 sall $2, %edx
8 movl %ebx, %eax
9 sall $4, %eax
10 subl %ebx, %eax
11 sall $2, %eax
12 movl array2(%eax, %ecx, 4), %eax
13 movl %eax, array1(%edx, %ebx, 4)
14 popl %ebx
15 movl %ebp,%esp
16 popl %ebp
ret