我正在使用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
干杯。
答案 0 :(得分:2)
您需要使用GCC的extended asm syntax告诉它您正在使用哪些寄存器作为输入和输出以及哪些寄存器被破坏。如果你不这样做,它就不知道你在做什么,它生成的程序集很容易干扰你的代码。
通过告知代码正在执行的操作,它会更改注册分配和优化的方式,并避免破坏代码。
答案 1 :(得分:0)
这是因为gcc尝试优化您的代码。您可以通过向命令行添加-O0
来阻止优化。
答案 2 :(得分:0)
如果您不想要,请尝试在__asm__之后添加volatile。附加命令可能是前一个/下一个C指令的一部分。如果没有volatile,编译器就可以执行此操作(因为它可能以这种方式执行得更快 - 而不是代码,整个例程)。