【发布时间】:2023-03-18 06:46:01
【问题描述】:
在 x64 中,我想在给定 64 位地址的情况下从内存中读取 32 位值。这似乎相当琐碎,只需使用movl 指令即可。
但是,使用 GCC 内联“扩展”汇编程序,我无法完成这项工作。以下是我的代码:
unsigned row = 0;
__asm __volatile__
(
"again:"
"movzbq (%[px]), %%rax\n"
"movzwq (%[symbols],%%rax,2), %%rax\n"
"add %[table], %%rax\n"
"movl (%%rax,%[row],4), %[row]\n" /* <------------ */
"cmp %[row], %[match_limit]; jb end;\n"
"inc %[px]\n"
"cmp %[px_end], %[px]; jb again\n"
"end:\n"
: "=r" (row), "=r" (px)
: [row] "0" (row),
[px] "1" (px),
[px_end] "r" (px_end),
[symbols] "r" (char_to_symbol),
[table] "r" (table),
[match_limit] "r" (match_limit)
: "%rax"
);
这给了我“指令操作数无效”的错误消息。如果我将movl 更改为movslq,它会做我想做的事情(只要我的号码是31 位或更少)。换句话说,我想要的是movzlq 行为——除非它不存在,因为在 x64 中所有移动都将零扩展。
我对 GCC 的扩展内联语法非常陌生。我如何在这个位置获得movl?
【问题讨论】:
-
这是 AT&T 语法 -- 目的地是
%[row],而不是%rax -
您似乎正试图从一个内存移动到另一个内存。
mov无法做到这一点。
标签: 64-bit x86-64 inline-assembly