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,保护的责任则是在函数/子程,即调用函数/子程的前后,它们的内容不变。