关于栈对齐的反汇编代码

这里写图片描述

有时在函数入口处,可能会见到如此的反汇编代码,这段代码的意义是为了让栈 4 字节对齐。栈对齐失衡,可能是由于函数的调用约定混用等影响。其实,用 vs 编译器传入一个 2 个字节的参数时,编译器会自动将该 2 个字节扩展为 4 个字节,再作为参数传入。

编写显示时间的窗口程序

调用 GetSystemTime 后,得到的时间变量其实是 2 字节的。如果使用 32 位汇编编写代码,不转化为 4 字节直接传入,那么得到的结果将大相径庭。因为传入的参数必须四字节对齐。(贴上代码,32位汇编几乎全忘光了…)

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    LOCAL @st:SYSTEMTIME
    LOCAL @rc:RECT
    LOCAL @hDc:HDC
    LOCAL @szBuf[MAXBYTE]:BYTE
    LOCAL @dwNum:DWORD
    LOCAL @dwYear:DWORD
    LOCAL @dwMonth:DWORD
    LOCAL @dwDay:DWORD
    LOCAL @dwHour:DWORD
    LOCAL @dwMinute:DWORD
    LOCAL @dwSecond:DWORD

    mov     eax,uMsg
    .if eax==WM_INITDIALOG
        invoke SetTimer, hWin, 1, 1000, NULL
    .elseif eax==WM_COMMAND

    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,0
    .elseif eax == WM_TIMER
        invoke GetDC, hWin
        mov @hDc, eax
        invoke GetSystemTime, addr @st

        movzx eax, @st.wYear
        mov @dwYear, eax

        movzx eax,  @st.wMonth
        mov @dwMonth, eax

        movzx eax, @st.wDay
        mov @dwDay, eax

        movzx eax, @st.wHour
        mov @dwHour, eax

        movzx eax,  @st.wMinute
        mov @dwMinute, eax

        movzx eax, @st.wSecond
        mov @dwSecond, eax

        invoke wsprintf, addr @szBuf, offset g_Fmt, @dwYear, @dwMonth, @dwDay,
            @dwHour, @dwMinute, @dwSecond

        invoke lstrlen, addr @szBuf
        mov @dwNum, eax

        invoke GetClientRect, hWin, addr @rc
        .if eax == 0
            invoke ReleaseDC, hWin, @hDc
            ret
        .endif

        invoke DrawText, @hDc, addr @szBuf, @dwNum, addr @rc, DT_VCENTER OR DT_CENTER OR DT_SINGLELINE

        invoke ReleaseDC, hWin, @hDc        
    .else
        mov     eax,FALSE
        ret
    .endif
    mov     eax,TRUE
    ret

DlgProc endp
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页