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型变量后,再处理。