GNU内联asm:哪些寄存器被__stdcall阻塞
GNU inline asm: which registers get clobbered by __stdcall?
如果我通过C++代码中的GNU内联汇编程序使用call
指令来调用我知道使用__stdcall
约定的函数,我是否必须将任何寄存器列为clobbered?
我在互联网上找不到很好的指导,但看起来%eax
、%edx
和%ecx
是调用方保存,前两个保留为返回值。
这是我的密码。我想知道我需要在第三个冒号后面加什么。
#include <cstdint>
namespace {
inline uint64_t invoke_stdcall(uint64_t (* stdcall_func)())
{
unsigned long hi32, lo32;
asm(
"call %2"
: "=d" (hi32), "=a" (lo32)
: "m" (stdcall_func)
: /* HELP! What goes here? */
);
return static_cast<uint64_t>(hi32) << 32 | static_cast<uint32_t>(lo32);
}
} // anonymous namespace
这个消息线程是我在互联网上能找到的最好的,但我没能找到任何写着"这是__stdcall
认为它可以在不保存的情况下修改的"的东西。。。
MS确实解释了EAX、EDX和ECX是";销毁";通过调用,所有其他寄存器必须由被调用者以32位代码保存,链接到MSDN文档-使用哪种调用约定并不重要。
因此,为了清楚起见,您需要将ecx
标记为clobbered,因为eax
和edx
已经在您的内联汇编程序中使用了。
对于x86-64,文档在这里,上面写着
寄存器RBX、RBP、RDI、RSI、R12、R13、R14和R15被认为是非易失性的,必须由使用它们的函数保存和恢复。
相关文章:
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 为什么创建服务器后C++ httplib 库阻塞了我的主线程?
- 阻塞信号会导致升压过程不起作用
- 避免在条件更新时丢失唤醒是一个阻塞功能
- pthread_kill() 与 pthread_cancel() 终止因 I/O 而阻塞的线程
- 提升 asio io_content运行非阻塞
- 阻塞管道连接命名管道不触发
- 在C++中执行非阻塞线程
- 如果 I/O read() 处于阻塞阶段,如何使用 Ctrl+C 退出 C++ 程序?
- C++17 标准::异步非阻塞执行
- 如何实现阻塞处理循环?
- 不安全的 MPI 非阻塞通信示例?
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- cors 阻塞请求的根源在哪里?
- 用于免等待生产者和阻塞使用者的环形缓冲区
- 被阻塞的互斥量有多贵
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- C++如何判断互斥体在阻塞其他线程时是否被单个线程不成比例地占用
- 如何使用gcc指定stdcall调用约定