【发布时间】:2019-11-20 16:10:20
【问题描述】:
我正在尝试使用内联汇编执行与 b = ++a; 等效的操作,但在执行代码后我的变量中出现了奇怪的值。我正在使用 clang++(g++ 兼容)来编译内联汇编。到目前为止,这是我得到的:
#include <iostream>
using std::endl;
using std::cout;
int main()
{
uint64_t a = 0;
uint64_t b = 0;
asm volatile(
"pushq %%rbp;"
"movq %%rsp, %%rbp;"
"movl $0, -4(%%rbp);"
"movl $0, -8(%%rbp);"
"addq $1, -4(%%rbp);"
"mov -4(%%rbp), %%rax;"
"mov %%rax, -8(%%rbp);"
"mov -4(%%rbp), %0;"
"mov -8(%%rbp), %1;"
"movq %%rbp, %%rsp;"
"popq %%rbp"
:"=r" (a), "=r" (b)
:
:"%rax", "%rbp", "%rsp"
);
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
【问题讨论】:
-
什么是clang (GCC)?
-
苹果 clang 版本 11.0.0 (clang-1100.0.33.12) 目标:x86_64-apple-darwin18.7.0
-
movl $0, -4(%%rbp)只写入低 32 位,因此前 32 位是随机垃圾。此外,一个 64 位整数是 8 个字节。所以你想要-8(%rbp)和-16(%rbp)。您的代码当然在其他方面被破坏了,例如覆盖包含函数的红色区域,无论如何都没有多大意义。 -
谢谢,是的,它适用于 -8 和 -16,但我应该改变什么才可以?
标签: c++ x86 x86-64 inline-assembly clang++