Note 2023-03-15T21.26.46
1、返回值是如何传递的?
通过寄存器 或者全局地址
return eax,0x111
2、参数传递的本质
整数参数传递统一采用32位 int行 无论你是不是char类型 这是因为本机尺度
push 8 esp-4
(怎么找到压入的数据) 数据的复制
ebp+8 即可
3、局部变量的内存分配
小于32位的局部变量,空间在分配时,按32位分配.
参数与局部变量没有本质区别,都是局部变量,都在栈中分配.
完全可以把参数当初局部变量使用
局部变量 ebp-4
4、赋值语句的本质
比如
mov 【ebp-4】,12
其实也是值的复制
5、数组的本质
1、一组相同类型的变量,为了方便读写,采用另外一种表示形式.
2、数组在声明的时候,必须用常量来指明长度,不能使用变量.
数组在反汇编中的本质
实践1
10: int a[5] = { 1,2,3,4,5 };
00333E85 mov dword ptr [a],1
00333E8C mov dword ptr [ebp-14h],2
00333E93 mov dword ptr [ebp-10h],3
00333E9A mov dword ptr [ebp-0Ch],4
00333EA1 mov dword ptr [ebp-8],5
就是很简单的 开辟空间
1、一维数组与多维数组在反汇编上没有区别.
2、数量如果不够,其他的值会补零.
3、不允许超过维度的最大长度.
4、可以省略里面的{ }
5、可以省略第一维的值
2维数组寻值
19:
20: {1,2,1,4,5,6,7,8,9,1,2,3} //4
00EA525F mov dword ptr [ebp-34h],1
00EA5266 mov dword ptr [ebp-30h],2
00EA526D mov dword ptr [ebp-2Ch],1
00EA5274 mov dword ptr [ebp-28h],4
00EA527B mov dword ptr [ebp-24h],5
00EA5282 mov dword ptr [ebp-20h],6
00EA5289 mov dword ptr [ebp-1Ch],7
00EA5290 mov dword ptr [ebp-18h],8
00EA5297 mov dword ptr [ebp-14h],9
00EA529E mov dword ptr [ebp-10h],1
00EA52A5 mov dword ptr [ebp-0Ch],2
00EA52AC mov dword ptr [ebp-8],3
21:
22: };
23:
24: ///编译分配空间:
25:
26: printf("%d", arr[1][1]);
00EA52B3 mov eax,30h
00EA52B8 shl eax,0
00EA52BB lea ecx,arr[eax]
00EA52C2 mov edx,4
00EA52C7 shl edx,0
00EA52CA mov eax,dword ptr [ecx+edx]
00EA52CD push eax ///打印的参数
eax=30 数组总大小
SHL逻辑左移;左移,最低位补0,最高位进入CF。
获取第一年第9个月的数据
arr[0][8]
编译器是如何找到这个数据的
arr[0*12 + 8]
标签:复习,滴水,局部变量,3.15,mov,eax,ebp,dword,ptr From: https://www.cnblogs.com/Agtw/p/17220215.html