读书人

一个奇怪的win32汇编有关问题

发布时间: 2012-02-25 10:01:48 作者: rapoo

求助:一个奇怪的win32汇编问题?
.386
.model flat,stdcall
option casemap:none
include D:\masm32\include\windows.inc
include D:\masm32\include\kernel32.inc
include D:\masm32\include\user32.inc
includelib D:\masm32\lib\kernel32.lib
includelib D:\masm32\lib\user32.lib
MYSYSTEMTIME STRUCT
wYear WORD ?
wMonth WORD ?
wDayWeek WORD ?
wDay WORD ?
wHour WORD ?
wMinute WORD ?
wSecond WORD ?
wMilliseconds WORD ?
MYSYSTEMTIME ENDS
Temp_Data equ 7cfH
.data
MyTime MYSYSTEMTIME <>
wTheTemp dw ?
.code
start:
invoke GetLocalTime,addr MyTime
mov ax,MyTime.wYear
push eax
mov ax,Temp_Data
mov MyTime.wYear,ax
invoke SetLocalTime,addr MyTime
invoke Sleep,15000
pop eax
invoke SetLocalTime,addr MyTime
invoke ExitProcess,0
end start
这是一个改时间的程序,15秒后再把系统时间改回来,我的问题是。这里红色的地方为什么把push eax pop eax 改成 push ax pop ax后程序就没用了!  我需要保存ax而己,应该跟eax无关吧。望各位大哥指教一下,小弟不盛感激

[解决办法]
因为win32 api 内部要求堆栈dword对齐,你压入一个word打破了这种对齐
约定,从而导致在执行win32 api时行为异常。比如和你的代码类似的一段:

Assembly code
        push     ax          ;sub    esp,2    invoke    MessageBox,NULL,addr msg,addr cp,MB_OK    pop ax 

读书人网 >汇编语言

热点推荐