zoukankan      html  css  js  c++  java
  • 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型变量后,再处理。

  • 相关阅读:
    Nightmare Ⅱ HDU
    Full Tank? POJ
    2601 电路维修 (双端队列bfs优先队列bfs(最短路))
    Sudoku POJ
    Pushing Boxes POJ
    2501 矩阵距离 (bfs)
    【排序】绝境求生
    【排序】逆序对IV
    【排序】紧急集合
    【排序】常用排序法
  • 原文地址:https://www.cnblogs.com/guanlaiy/p/2473108.html
Copyright © 2011-2022 走看看