以下是从GCC手册的扩展汇编文档中摘录的内容,介绍如何使用
如果一个输出参数(a)允许寄存器约束,而另一个输出参数(b)允许内存约束,则可能会出现相同的问题。 GCC生成的代码用于访问b中的内存地址可以包含寄存器,这些寄存器可能被a共享,并且GCC认为这些寄存器是asm的输入。与上面一样,GCC假定在写入任何输出之前已经使用了这些输入寄存器。如果asm语句在使用b之前写入a,则此假设可能导致不正确的行为。通过将&符号修饰符与a上的寄存器约束相结合,可以确保修改a不会影响b所引用的地址。否则,如果在使用b之前修改a,则b的位置未定义。
斜体句子表示,如果asm语句在使用b之前写入a,则可能会出现“不正确的行为”。
我无法想象这样的“不正确行为”可能发生了,因此我希望有一个具体的asm代码示例来演示“不正确的行为”,以便我能深入理解这段文字。
当两个这样的asm代码并行运行时,我可以理解这个问题,但是上面的段落没有提到多处理场景。
如果我们只有一个CPU和一个核心,您可以展示一个可能产生这种不正确行为的汇编代码,即修改a会影响b所引用的地址,使b的位置未定义。
我熟悉的唯一汇编语言是Intel x86汇编语言,因此请将示例针对该平台。
asm
关键字在C语言中嵌入汇编指令:如果一个输出参数(a)允许寄存器约束,而另一个输出参数(b)允许内存约束,则可能会出现相同的问题。 GCC生成的代码用于访问b中的内存地址可以包含寄存器,这些寄存器可能被a共享,并且GCC认为这些寄存器是asm的输入。与上面一样,GCC假定在写入任何输出之前已经使用了这些输入寄存器。如果asm语句在使用b之前写入a,则此假设可能导致不正确的行为。通过将&符号修饰符与a上的寄存器约束相结合,可以确保修改a不会影响b所引用的地址。否则,如果在使用b之前修改a,则b的位置未定义。
斜体句子表示,如果asm语句在使用b之前写入a,则可能会出现“不正确的行为”。
我无法想象这样的“不正确行为”可能发生了,因此我希望有一个具体的asm代码示例来演示“不正确的行为”,以便我能深入理解这段文字。
当两个这样的asm代码并行运行时,我可以理解这个问题,但是上面的段落没有提到多处理场景。
如果我们只有一个CPU和一个核心,您可以展示一个可能产生这种不正确行为的汇编代码,即修改a会影响b所引用的地址,使b的位置未定义。
我熟悉的唯一汇编语言是Intel x86汇编语言,因此请将示例针对该平台。