我在尝试在 FreeBSD 64 位中运行的 C 程序中遇到了一段汇编代码。
void *curbrk;
__asm__ __volatile__(
"movl .curbrk, %%eax;"
"movl %%eax, %0"
: "=r" (curbrk)
:: "%eax"
);
我收到类似“mov missing suffix or operand”的错误。(上面的代码遵循 AT&T 语法)是什么决定了我应该用于代码的语法 - 编译器(gcc 遵循 AT&T 语法)或处理器(我是在英特尔处理器上工作)。问题是由于代码采用 AT&T 语法还是我遗漏了什么?
最佳答案
如果您有 64 位 GCC,除非您使用 -m32 开关输出 32 位目标代码,否则上述代码将无法完成,因为 64 位指针值将不适合 32 位 EAX 寄存器.使用 -m32 生成 32 位输出,或者使用 rax 代替 eax 并将 movl 更改为 mov(不带“l”)
关于c - gcc中汇编语句的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777113/