Asm和VC混合编程

mac2026-04-07  6

Asm和VC混合编程 局部变量
masm符号
@@ @F即(forward),指令后第一个@@标号 @B即(before),指令前第一个@@标号局部变量 TestProc proc local @local:DWORD local @local2:WORD local @local3:BYTE mov eax, @local mov ax, @local2 mov al, @local3 ret TestProc endp

反汇编

00401000 /$ 55 push ebp 00401001 |? 8BEC mov ebp,esp 00401003 |? 83C4 F8 add esp,-0x8 00401006 |? 8B45 FC mov eax,[local.1] 00401009 |. 66:8B45 FA mov ax,word ptr ss:[ebp-0x6] 0040100D |? 8A45 F9 mov al,byte ptr ss:[ebp-0x7] 00401010 |? C9 leave

说明

TestProc为一个函数,反汇编后对应为栈帧

push ebp mov ebp,esp ... ... mov esp,ebp pop ebp retn

ebp : extended base pointer,基址指针寄存器,行使栈帧指针 esp : extended stack pointer,栈顶指针

函数调用,原则就是esp指向下一个(函数)ebp (esp -> ebp) ,这样使得不同的代码块(函数)指向独立的内存空间。(这样就像C数据结构的*next指针,尾指针总指向下一个头结点,把图画出来就很清晰了。),ebp的入栈与恢复过程可以看出一个简单的数学问题。这就好像有两个班的学生一起跑步,1班在前,2班在后,只要保证1班的最后一个永在2班第一个前面,两个班就分隔开(独立),在图上标出ebp和esp。

push ebp : ebp 32bit 4byte,ebp内容入栈,esp-4,文字如果不好理解,可以借用数学描述符/伪指令,按下面来看

f(‘push’,‘ebp’) = esp(esp-4,(ebp)) 或者数对 f(push,reg) = (addr(esp-4), content(reg))

mov ax,word ptr ss:[ebp-0x6] ebp偏移量减小 <==> 为变量开辟/分配空间 leave <==> mov esp,ebp + pop ebp

最新回复(0)