在GCC内联汇编中,等于符号g"= g"是什么意思/做什么?

lad*_*kie 7 c x86 assembly gcc

我不确定这个内联汇编是做什么的:

asm ("mov %%esp, %0" : "=g" (esp));
Run Code Online (Sandbox Code Playgroud)

特别是那个: "=g" (esp)部分.

ugh*_*fhw 9

"=g" (esp)定义内联汇编的输出.该g告诉它可以使用任何通用寄存器或内存,存储结果的编译器.的(esp),该结果将被存储在名为C变量的装置esp.mov %%esp, %0是汇编命令,它只是将堆栈指针移动到第0个操作数(输出).因此,此程序集只是将堆栈指针存储在名为的变量中esp.

  • 2)是的,任何一般登记册.4)GCC使用AT&T语法,这意味着第一个操作数是源,第二个是目的地.1,3)内联汇编可以被认为是内联函数.它可以有多个输入和输出,允许汇编和c代码相互通信.参数编号用于从代码访问.`%0`表示第0个参数.编译器将自动决定应该使用什么并在代码中替换它,然后添加代码以将其从那里移动到变量. (2认同)

Nem*_*emo 9

如果您需要详细信息,请阅读有关Extended Asm的GCC文档.

简短的回答是,它将x86堆栈指针(%esp寄存器)移动到名为"esp"的C变量中."= g"告诉编译器它可以替换%0汇编代码中的哪种操作数.(在这种情况下,它是一个"通用操作数",这意味着几乎允许任何寄存器或内存引用.)