如何在英特尔语法中将汇编中的立即值传递给shr?

Jas*_*oss 2 c assembly gcc

根据该参考文献该参考文献,该shr指令支持1通过CL寄存器和立即值进行移位.但是,我似乎无法立即获得工作价值; 当我有这个代码时:

#include <stdint.h>

int main() {
  uint64_t v = 15;
  asm ("shr %[v], $0x04\t\n"
       : [v] "+r" (v)
       :
       : "cc"
       );
  return v;
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

$ gcc -masm=intel foo.c
foo.c: Assembler messages:
foo.c:5: Error: operand size mismatch for `shr'

如何将立即值传递给shr(不加载CL,我关心,因为我正在优化寄存器压力瓶颈).

mya*_*aut 6

您正在使用具有Intel汇编语法的指南.GNU程序集(GAS)使用AT&T语法,它具有操作数的逆序.改变他们的顺序似乎做得很好:

uint64_t v = 0xffff;
asm ("shr $0x04, %[v]\n"
   : [v] "+r" (v)
   :
   : "cc"
   );
printf("%llx", v);        // 0xfff
Run Code Online (Sandbox Code Playgroud)

(你也可以替换shr使用shrq,使64位运算的使用显式)

如果您仍然希望使用英特尔语法-masm=intel,则必须从立即值中删除美元符号:

asm ("shr %[v], 4\n"
     ...)
Run Code Online (Sandbox Code Playgroud)

  • 是的,将-masm = intel`与inline-asm一起使用通常是一个糟糕的计划,但是如果你是一致的话它会起作用.如果您确实为它编写了asm,那么您必须要求它.@JasonGross:您可以为ATT/Intel编写[alternative](https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Multiple-assembler-dialects-in-asm-templates),例如`asm ("{shr $ 4,%[v] | shr%[v],4} \n":...);`所以你的inline-asm可以两种方式工作,但这只是陷入了巨大的混乱而不是值得一提,除非您正在为多个项目中使用的头文件编写内容.(然后,https://gcc.gnu.org/wiki/DontUseInlineAsm) (2认同)