我正在使用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/