首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-02-25 
求助:一个奇怪的win32汇编问题?.386.model flat,stdcalloption casemap:noneinclude D:\masm32\include\wi

求助:一个奇怪的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 

热点排行