我正在使用Apple的llvm-gcc通过内联汇编来编译一些代码。我写了我想做的事,但是它添加了多余的命令,这些命令一直将变量写入内存。为什么要这样做,我该如何停止呢?

例:

__asm__{
  mov r11, [rax]
  and r11, 0xff
  cmp r11, '\0'
}


变为(在“程序集”助手视图中):

mov  0(%rax), %r11     // correct
movq %r11, -104(%rbp)  // no, GCC, obviously wrong
and  $255, %r11
movq %r11, -104(%rbp)
cmp  $0, %r11


干杯。

最佳答案

您需要使用GCC的extended asm syntax告诉它您正在使用哪些寄存器作为输入和输出,哪些寄存器被破坏了。如果您不这样做,那么它将不知道您在做什么,并且它生成的程序集很容易干扰您的代码。

通过通知代码您正在执行的操作,它可以更改寄存器分配和优化的方式,并避免破坏代码。

关于gcc - 为什么GCC会向我的嵌入式程序集添加程序集命令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10635496/

10-11 01:42