GNU 内联汇编中的百分比 (%) 符号(C 中的 asm)
Percentage (%) sign in GNU inline assembly (asm in C)
这些代码行应该做什么?
mov ebx, %1
mov ecx, %0
我知道 % 表示指针,但我需要更多解释。为什么是 %1 和 0 - 这些特定数字?
%0 和 %1 是内联汇编块的前两个操作数。
它不是常规的 x86,但我认为是 gcc 特有的。
看这里:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
在 AT&T 语法中,使用百分号和寄存器名称来引用寄存器,即 %eax
。但是,您用数字显示的那些在汇编中没有意义,它们在内联汇编中用于引用输入和输出操作数。
int i = 5;
int j;
asm ("mov %1, %0" : "=r"(j) : "r"(i)); //AT&T. Swap operands for Intel syntax
这将分别声明 i
和 j
作为输出和输入参数。 q
意味着,任何通用寄存器都可以。除非你真的需要一个特定的寄存器,否则你应该总是让你的编译器选择任何方便的。由于您事先不知道获得了哪些寄存器,因此会为它们分配一个从 0 开始的数字。%0
是第一个参数,在这种情况下,输出参数 j
和 %1
是输入参数,i
.
这些代码行应该做什么?
mov ebx, %1
mov ecx, %0
我知道 % 表示指针,但我需要更多解释。为什么是 %1 和 0 - 这些特定数字?
%0 和 %1 是内联汇编块的前两个操作数。 它不是常规的 x86,但我认为是 gcc 特有的。
看这里:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
在 AT&T 语法中,使用百分号和寄存器名称来引用寄存器,即 %eax
。但是,您用数字显示的那些在汇编中没有意义,它们在内联汇编中用于引用输入和输出操作数。
int i = 5;
int j;
asm ("mov %1, %0" : "=r"(j) : "r"(i)); //AT&T. Swap operands for Intel syntax
这将分别声明 i
和 j
作为输出和输入参数。 q
意味着,任何通用寄存器都可以。除非你真的需要一个特定的寄存器,否则你应该总是让你的编译器选择任何方便的。由于您事先不知道获得了哪些寄存器,因此会为它们分配一个从 0 开始的数字。%0
是第一个参数,在这种情况下,输出参数 j
和 %1
是输入参数,i
.