当前位置: 代码迷 >> 汇编语言 >> 一个奇怪的win32汇编有关问题
  详细解决方案

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

热度:865   发布时间:2013-02-26 00:00:00.0
求助:一个奇怪的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
  相关解决方案