//asm source code note 1.1
//空的main函数(debug版)对应的asm代码
7: int main(int argc, char* argv[])
8: {
00401010 push ebp //保存ebp, 要用ebp来保存栈顶, esp -= 4
00401011 mov ebp,esp //用ebp保存栈顶, ebp在本程序执行时, 从来没有变过.
00401013 sub esp,40h //开辟0x40长度的临时变量空间
//保存要用到的3个寄存器
00401016 push ebx //esp -= 4
00401017 push esi //esp -= 4
00401018 push edi //esp -= 4
00401019 lea edi,[ebp-40h] //用0xcc填充开辟出的0x40长度的临时变量空间
0040101C mov ecx,10h //开辟出的临时变量空间是0x40 = 需要填充DWORD(4字节) * 0x10次
00401021 mov eax,0CCCCCCCCh //填充的内容是0xcccccccc
00401026 rep stos dword ptr [edi] //(edi = ebp-40h) => (edi = ebp), 这样把从栈顶开辟的0x40变量空间都填充了
9: return 0;
00401028 xor eax,eax //返回值为0, 恒在eax中
10: }
//按顺序弹出保存的3个寄存器
0040102A pop edi
0040102B pop esi //esi 没有用到
0040102C pop ebx //ebx 没有用到
0040102D mov esp,ebp //恢复栈顶, ebp在本程序执行时, 从来没有变过, 所以直接赋给esp, 用来恢复栈顶
0040102F pop ebp //恢复ebp
00401030 ret
//通用寄存器功能说明
eax 累加器
ebx 基地址寄存器, 可作为存储器指针
ecx 计数寄存器, 来控制循环次数
edx 数据寄存器
ESI 变址寄存器, 存放存储单元在段内的偏移量
EDI 变址寄存器, 存放存储单元在段内的偏移量
EBP 指针寄存器, 用于访问堆栈内的存储单元, 存取堆栈中的数据
ESP 指针寄存器, 用于访问堆栈内的存储单元, 只可访问栈顶
EIP 指令指针寄存器, 存放下次将要执行的指令在代码段的偏移量
//堆栈地址变化说明
//栈顶地址addr, 栈底是addr - xx
//栈底方向
0013FF40 44 2E 42 00 83 00 00 00 D8 3D 03 00 D8 35 03 00 D.B......=...5..
0013FF50 D8 3D 03 00 74 FF 13 00 95 C6 40 00 00 02 00 00 .=..t...暺@.....
0013FF60 00 08 00 00 02 00 00 00 44 2E 42 00 83 00 00 00 ........D.B.....
0013FF70 03 00 00 00 7C FF 13 00 88 13 40 00 8C FF 13 00 ....|.....@.....
0013FF80 C0 FF 13 00 29 11 40 00 01 00 00 00 00 18 03 00 ....).@.........
0013FF90 78 18 03 00 00 00 00 00 00 00 00 00 00 B0 FD 7F x............褒.
//栈顶方向
//push esp -= 4, 向栈底靠拢
//pop esp += 4, 向栈顶靠拢