在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
?