首页 > 解决方案 > GNU 内联汇编(C 中的 asm)中的百分比 (%) 符号

问题描述

这些代码行应该做什么?

mov ebx, %1

mov ecx, %0

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

标签: cgccassemblyx86inline-assembly

解决方案


在 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


推荐阅读