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

发布于 2022-09-02 11:01:36 字数 817 浏览 14 评论 0

_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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

高速公鹿 2022-09-09 11:01:36

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

一般对于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的手段。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文