- 论坛徽章:
- 2
|
笔记,凑合着看吧:
5, UNDOCUMENTED: %c0, %n0, %l0, %P0 ....
有时侯我们会想这么写一条汇编语句:
/* 错误写法 */
asm volatile ("movl %0(%%esp), %%eax" : /* no outputs */ : "i" (-1) );
但这样子gcc会报错:
Error: junk `(%esp)' after expression
猜测原因是,%0是立即数(用"i"指定了的),于是gcc会把这条汇编指令变成:
movl $-1(%esp), %eax
于是它就会报错,因为多了一个无用的$符号。
需要改成:
asm volatile ("movl %P0(%%esp), %%eax" : /* no outputs */ : "i" (-1) );
例子:/*{{{*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
unsigned long p1, p2, p3, p4;
p1 = p2 = p3 = p4 = 0;
asm volatile ("leal %P4(%%esp), %0\n\t"
"leal %P5(%%esp), %1\n\t"
"leal %P6(%%esp), %2\n\t"
"leal %P7(%%esp), %3\n\t"
: "=r" (p1) , "=r" (p2), "=r" (p3), "=r" (p4)
: "i" (-1), "i" (-2), "i" (-3), "i" (-4)
);
/* core2上的输出:
* p1 is bfde32af, p2 is bfde32ae, p3 is bfde32ad, p4 is bfde32ac
*/
printf("p1 is %x, p2 is %x, p3 is %x, p4 is %x\n", p1, p2, p3, p4);
return 0;
}
/*}}}*/
%c0
%n0
%l0
%P0 |
评分
-
查看全部评分
|