3

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

干杯。

4

3 回答 3

2

您需要使用 GCC 的扩展 asm 语法来告诉它您将哪些寄存器用作输入和输出以及哪些寄存器被破坏。如果你不这样做,它就不知道你在做什么,它生成的程序集很容易干扰你的代码。

通过通知它你的代码在做什么,它改变了它如何进行寄存器分配和优化,并避免破坏你的代码。

于 2012-05-18T18:16:09.393 回答
0

这是因为 gcc 试图优化你的代码。-O0您可以通过添加到命令行来防止优化。

于 2012-05-17T12:17:11.457 回答
0

如果您不想这样做,请尝试在 __asm__ 之后添加 volatile。附加命令可能是上一个/下一个 C 指令的一部分。没有 volatile 编译器允许这样做(因为它可能以这种方式执行得更快 - 不是你的代码,整个例程)。

于 2012-05-17T18:14:29.570 回答