What does %P stand for in gcc inline assembly
In Linux kernel linux/arch/x86/boot/main.c
, I found a piece of inline asm code:
asm("leal %P1(%%esp),%0"
: "=r" (stack_end) : "i" (-STACK_SIZE));
This code snippet is pretty simple, but %P1
confused me. I checked some assembly language tutorials, but found nothing about this.
So, can anyone give me some pieces of clue about this?
The P
output modifier is unofficially documented in a comment in 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.
The upper-case P
modifier probably isn't what is wanted here, but when not compiling PIC (Position Independent Code), then it acts like the lower-case p
modifier. The intent to prevent the compiler from emitting the operand using the format normally used for immediate values, which wouldn't work here. As David Wohlferd said it would be a better idea to use the c
modifier, which is documented and is meant specifically to handle immediate values. Mind you this code was probably written before the c
modifier was documented, as for a long time none of the modifiers were documented.
Given that the inline assembly statement is only executed once at boot time, performance doesn't matter, so I wouldn't have bothered trying to be smart by using LEA. You can avoid the operand modifiers completely with something simple like:
char *stack_pointer;
asm ("mov %%esp, %0" : "=r" (stack_pointer));
stack_end = stack_pointer - STACK_SIZE;
链接地址: http://www.djcxy.com/p/34238.html
上一篇: JavaScript location.href调用是异步的吗?
下一篇: %P在gcc内联汇编中代表什么?