使用GCC内联在x64上移动

时间:2014-03-16 05:20:38

标签: 64-bit x86-64 inline-assembly

在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

1 个答案:

答案 0 :(得分:2)

您需要为(较低的)32位寄存器使用k操作数修饰符,例如,

movl (%%rax,%0,4), %k0

我不知道在哪里可以找到这些明确的清单。有these个答案,有this教程。