win32汇编问题堆栈

win32汇编下,堆栈以dword对齐。

在push或invoke api调用时,要注意堆栈平衡问题。

push 立即数       ;这个立即数将自动以dword类型存入堆栈,并且压站后esp-4,不会有任何问题。

push var           ;这种属于间接寻址,如果var为dword型,压站后esp-4,没有问题;如果var为word型,压站后esp-2,将导致堆栈不平衡;如果var为byte型,语法错误,push al也会语法错误。

例如:

szMsg      db '%04X', 0dh, 0ah, 0

local @wTmp:    word

local @szBuf[256]:byte

mov @wTmp, 3

invoke wsprintf, addr @szBuf, addr szMsg, @wTmp

这段代码将会出错:@wTmp为word类型,wsprintf函数会使用push word ptr [xxxxxxxx]的操作,但wsprintf函数的清栈操作是DWORD类型,用WORD类型的入栈,而用DWORD类型出栈,会出现堆栈的不平衡而出错。解决这个问题就是必须先将@wTmp的结构成员转换成DWORD类型再用wsprintf操作。

解决办法:将@wTmp转入32为寄存器或dword型变量后,再处理。

原文地址:https://www.cnblogs.com/guanlaiy/p/2473108.html