首页 > 对于同一个局部变量为何要在循环内使用lea而不在循环外?

对于同一个局部变量为何要在循环内使用lea而不在循环外?

_ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam
                local @szBuffer[128]:byte
                local @szBuffer1[128]:byte
                local @szTextBuff[2048]:byte
                local @dwCount
                
                ...
                
                lea    esi,@szBuffer
                .while  @dwCount
                        lodsd
                        lea    ecx,@szBuffer1 //就是这一行,为什么不放到循环外面去?
                        invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETTEXT,eax,ecx
                        invoke lstrcat,addr @szTextBuff,addr szReturn
                        invoke lstrcat,addr @szTextBuff,addr @szBuffer1
                        dec @dwCount
                .endw

                ...
                
_ProcDlgMain    endp

并不太清楚题主的平台,语言以及编译器等情况,我就按照自己理解的一般情况来说。

一般对于x86 calling convention来说,特别的,如果这是c语言编译后的结果,使用的cdecl calling convention,那么ECX是由调用者保存的,换句话说由于被调用的函数并不负责保存ECX, 题主例子中的ECX值可能在后续的函数调用后被覆盖。

Registers EAX, ECX, and EDX are caller-saved, and the rest are callee-saved.

所以,像题主的例子里,每次去获取那个buffer的地址并写入ECX是外层调用者保存ECX的手段。

【热门文章】
【热门文章】