gpt4 book ai didi

c - 将 xmm 寄存器压入堆栈时出错

转载 作者:行者123 更新时间:2023-11-30 15:22:43 26 4
gpt4 key购买 nike

我正在尝试使用 GCC 风格的内联汇编将 xmm 寄存器推送到 x86_64 C 代码中的堆栈上。我查看了this的答案问题并正在使用此代码

int main(void) {
asm volatile("subq 16, %rsp");
asm volatile("movdqu xmm0, xmmword ptr (%rsp)");
}

当我使用 clang 6.0 在 OS X 10.10.2 上编译它时,出现错误 error:unknown token in argument list,并且有一个绿色箭头指向第二个 asm 行中的 ptr .

我将代码更改为

int main(void) {
asm volatile("subq 16, %rsp");
asm volatile("movdqu xmm0, xmmword (%rsp)");
}

它给了我错误:指令的操作数无效。我尝试将 xmmword 更改为 dqword,但没有成功,而且我不确定我做错了什么。

提前致谢。

最佳答案

x86 的汇编程序(至少)有两种方言:intel 格式和 at&t 格式。看起来您正在尝试使用 intel 格式编写代码,但使用 at&t 进行编译。

您的代码将编译为:

int main(void) {
asm volatile("subq 16, %rsp");
asm volatile("movdqu %xmm0, (%rsp)");
}

如果您使用 -masm=intel 编译开关,您也可以使用这个(您可能看起来更熟悉):

int main(void) {
asm volatile("sub rsp, 16");
asm volatile("movdqu xmmword ptr [rsp], xmm0");
}

也就是说,像这样使用多个 asm 语句编写 asm block 是一个坏主意。 gcc 文档明确 state :

不要期望一系列 asm 语句在编译后保持完全连续。如果某些指令需要在输出中保持连续,请将它们放在单个多指令 asm 语句中。

所以也许更像是:

int main(void) {
asm volatile("subq 16, %rsp\n"
"movdqu %xmm0, (%rsp)");
}

此外,如果您要读取或更新变量,则不应使用 basic asm ,而是使用 Extended 。那里的文档非常详细,并且有很多示例。

关于c - 将 xmm 寄存器压入堆栈时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29112919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com