%P在gcc内联汇编中代表什么?

在Linux内核linux/arch/x86/boot/main.c ,我找到了一段内联asm代码:

asm("leal %P1(%%esp),%0"
        : "=r" (stack_end) : "i" (-STACK_SIZE));

这段代码非常简单,但%P1让我困惑。 我检查了一些汇编语言教程,但没有发现任何关于此的信息。

那么,任何人都可以给我一些线索吗?


P输出修饰符在gcc / config / i386 / i386.md的注释中非正式记录:

;; The special asm out single letter directives following a '%' are:
...
;; P -- if PIC, print an @PLT suffix.
;; p -- print raw symbol name.

大写的P修饰符可能不是这里所要的,但是当不编译PIC(位置独立代码)时,它就像小写的p修饰符一样。 意图防止编译器使用通常用于立即值的格式发出操作数,这在这里不起作用。 正如David Wohlferd所说,使用c修饰符会更好,它被记录下来并专门用于处理即时值。 请注意,这段代码可能是在c修饰符被记录之前编写的,因为很长一段时间没有任何修饰符被记录。

鉴于内联汇编语句仅在启动时执行一次,性能并不重要,所以我不会因使用LEA而试图变得聪明。 您可以完全避免操作数修饰符,如下所示:

 char *stack_pointer;
 asm ("mov %%esp, %0" : "=r" (stack_pointer));
 stack_end = stack_pointer - STACK_SIZE;
链接地址: http://www.djcxy.com/p/34237.html

上一篇: What does %P stand for in gcc inline assembly

下一篇: LINQ Orderby Descending Query