自动调用MASM保存寄存器?

发布于 2024-10-02 12:00:37 字数 42 浏览 4 评论 0原文

当我在masm中使用Invoke指令时,是否可以自动保存CPU寄存器?

Is it possible to save cpu registers automatically when I use the Invoke directive in masm?

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

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

发布评论

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

评论(3

对不⑦ 2024-10-09 12:00:37

看看我在那里发布的示例:汇编语言中的选择排序

目标 PROC 中的 USES 指令就是您正在寻找的内容。
使用 EAX ESI EDI 将在 PROC 进入时自动保存这些寄存器,并在退出时恢复它们(即使您有多个 RET 点,即使不建议有多个 ret 点)。 IOW,它将在 PROC 输入时生成 PUSH,并在每次 RET 之前生成一致匹配(逆序)的 POP。这个想法是,由于这是汇编,因此您对您修改想要保留的寄存器拥有完全的控制权和责任。
与其他地方的建议相反,声明 stdcall 不会在 MASM 中自动为您保留任何内容。它只是确定调用者(为 INVOKE 生成的代码)还是被调用者(在 PROC 中生成的代码)是否 POP 参数。

Look at the example I posted there: selection sort in assembly language

The USES directive in the target PROC is what you are looking for.
USES EAX ESI EDI will automatically save those registers upon PROC entry and restore them upon exit (even if you have multiple RET points, and even if having multiple ret points is not recommended). IOW, it will generate PUSHes upon PROC entry and consistently matched (reverse order) POPs before each and every RET. The idea is that since this is assembly, you have full control and responsability upon those registers you modify and want to preserve.
And contrary to what was suggested somewhere else, declaring stdcall doesn't preserve anything automatically for you in MASM. It just determines whether the caller (code generated for INVOKE) or the callee (code generated in the PROC) POPs the parms.

素罗衫 2024-10-09 12:00:37

不确定你的意思,因为你的标签是 masm32 我假设 Windows x86。

完全可能的是推送 API 调用所需的所有参数,然后您只需调用所需的函数。我的意思是,当您在 Windows 程序集中进行编程时,您不需要使用寄存器来“调用”API,您必须推送参数,然后调用(或调用)API。

例如,这个:

push 0
push DWORD PTR SS:[EBP+8]
push 0
push 0
push 80000000h
push 80000000h
push 80000000h
push 80000000h
push 0CF0000h
push offset AppName
push offset ClassName
push 0h
call CreateWindowExA

完全等于这个(实际上只是参数的值不同):

invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
       WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
       CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
       hInst,NULL

这是你的问题的意思吗?

Not sure exactly what you meant, and since your tag is masm32 I'll assume Windows x86.

What is perfectly possible is to push all the arguments that an API call requires and then you just call the desired function. What I mean is that when you're promming in assembly for Windows you don't need to use registers to "invoke" the APIs, you have to push the arguments and then call (or invoke) the API.

For example, this:

push 0
push DWORD PTR SS:[EBP+8]
push 0
push 0
push 80000000h
push 80000000h
push 80000000h
push 80000000h
push 0CF0000h
push offset AppName
push offset ClassName
push 0h
call CreateWindowExA

is exactly equal to this (in fact just the values of the parameters are different):

invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
       WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
       CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
       hInst,NULL

Is that what you meant with your question?

奈何桥上唱咆哮 2024-10-09 12:00:37

“stdcall”调用约定保证该函数不会破坏除 eax、edx、ecx 之外的任何寄存器。如果你想保存 edx 和 ecx - 编写一个宏。

"stdcall" calling convention guarantees that function won't spoil any registers but eax, edx, ecx. If you want to save edx and ecx - write a macro.

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