我不确定这个内联汇编是做什么的:
asm ("mov %%esp, %0" : "=g" (esp));
尤其是
: "=g" (esp)
这部分内容。=g
(esp)"定义了内联汇编的输出。 g
告诉编译器可以使用任何通用寄存器或内存来存储结果。 (esp)
表示结果将存储在名为 esp
的c变量中。 mov %%esp,%0
是汇编命令,它只是将堆栈指针移动到第0个操作数(输出)。 因此,这个汇编程序只是将堆栈指针存储在名为 esp
的变量中。"%0
表示第0个参数。编译器将自动决定应该使用什么并将其替换为代码,然后添加代码将其从那里移动到变量中。gcc -S
查看编译器创建的汇编代码,并查看它实际上执行了什么操作。您还可以尝试不同的优化级别以查看它的操作。 - ughoavgfhw%0
操作数的类型。(在这种情况下,它是“通用操作数”,这意味着几乎任何寄存器或内存引用都是允许的。)
%0
即可。 - John Zwinck