.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