碰到个很诡异的情况

遇到个很诡异的情况
					invoke	GetWindowRect,hMenu,addr @stRect
mov eax,@stRect.left
invoke wsprintf,addr Buffer1,addr szD,eax
invoke MessageBox,NULL,addr Buffer1,NULL,MB_OK

push eax
invoke GetWindowRect,hWnd,addr @stRect
pop eax
invoke wsprintf,addr Buffer1,addr szD,eax
invoke MessageBox,NULL,addr Buffer1,NULL,MB_OK
这是代码
碰到个很诡异的情况
碰到个很诡异的情况
这是运行结果.

为什么eax的值莫名其妙的就变了?
------解决方案--------------------
invoke    wsprintf,addr Buffer1,addr szD,eax
invoke    MessageBox,NULL,addr Buffer1,NULL,MB_OK
 
push    eax

把这里 改为
push eax
invoke wsprintf , addr Buffer1 , addr szD , eax

invoke MessageBox , NULL , addr Buffer1 , NULL , MB_OK
invoke    GetWindowRect,hWnd,addr @stRect
pop eax   ;或者 可以把这个省去
invoke    wsprintf,addr Buffer1,addr szD,eax

------解决方案--------------------
eax 是作为函数/子程的结果返回的,所以,在调用函数/子程后,eax 几乎是必被修改,这是寄存器是使用约定,类似的寄存器还有 ecx 和 edx,如果要在函数/子程后继续使用它们,就得自己进行保护;另外的寄存器 ebx、esi 和 edi,保护的责任则是在函数/子程,即调用函数/子程的前后,它们的内容不变。