GNU内联汇编中的百分比(%)符号(C中的asm)

问题描述 投票:1回答:2

这些代码行应该做什么?

mov ebx, %1

mov ecx, %0

我知道%表示指针,但我需要更多解释。为什么%1和0 - 这些具体数字?

c gcc assembly x86 inline-assembly
2个回答
3
投票

在AT&T语法中,寄存器使用百分号,然后是寄存器名称,即%eax。然而,您使用数字显示的那些在汇编中没有意义,它们用于内联汇编以引用输入和输出操作数。

int i = 5;
int j;
asm ("mov %1, %0" : "=r"(j) : "r"(i)); //AT&T. Swap operands for Intel syntax

这将分别声明ij作为输出和输入参数。 q意味着,任何通用寄存器都可以。除非你真的需要一个特定的寄存器,否则你应该总是让编译器选择方便的东西。由于您事先不知道哪个寄存器,因此它们会从0开始分配一个数字.%0是第一个参数,在这种情况下,输出参数j%1是输入参数i


1
投票

%0和%1是内联汇编块的前两个操作数。我认为这不是常规的x86,但对于gcc来说是特殊的。

见这里:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

© www.soinside.com 2019 - 2024. All rights reserved.