【发布时间】:2013-07-02 21:16:46
【问题描述】:
我认为这是一个简单的问题,但我找不到任何东西。 如果我写
void bar()
{
{
void *rax = 0/* ...*/, *rbx = 0/* ... */;
asm volatile ("movq %0, %%rax; movq %1, %%rbx;" : : "m"(rax), "m"(rbx));
goto foo;
}
{
foo:
void* rax, *rbx;
asm volatile ("movq %%rax, %0; movq %%rbx, %1;" : "=m"(rax), "=m"(rbx));
// LOTS OF CODE
}
}
是否保证我可以在第二个块中的任何其他代码运行之前获取 rax/rbx 的值?
【问题讨论】:
-
似乎是一个 XY 问题 - 你到底想解决什么问题?
-
我正在为 C++ 编写一个函数挂钩库。我想使用 ABI 未使用的寄存器将用户数据指针传输到钩子函数。
-
那么为什么不编写一个调用实际函数的汇编包装器呢?这是解决这个问题的传统方法。
-
顺便说一句,您的意思是从名为 rax 的变量读取到寄存器中,还是在第一个汇编程序部分中相反?以如此冗长的方式将 0 加载到寄存器中似乎很奇怪。
-
1.) 我使用汇编程序包装器来调用函数 - 但我尝试将用户数据指针传输到被调用函数,以便调用函数对象而不是常规 C 函数。
标签: c++ c assembly inline-assembly