#define _set_tssldt_desc(n,addr,type) /
__asm__ (“movw $104,%1/n/t” /
“movw %%ax,%2/n/t” /
“rorl $16,%%eax/n/t” /
“movb %%al,%3/n/t” /
“movb $” type “,%4/n/t” / //这儿用了$” type “,后边用了”0x89″,” type “在这儿为何要加上双引号?别的type的前面为何加了“$”?AT&T汇编当即数前面才加”$”的啊,为何?
“movb $0x00,%5/n/t” /
“movb %%ah,%6/n/t” /
“rorl $16,%%eax” /
::”a” (addr), “m” (*(n)), “m” (*(n+2)), “m” (*(n+4)), /
“m” (*(n+5)), “m” (*(n+6)), “m” (*(n+7)) /
)
#define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,”0x89″) //这儿的”0x89″又为何要加上双引号呢?
#define set_ldt_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,”0x82″)
原因解说:
由于在$” type “处的原意是要取type的内容作为当即数操作
简略比较一下几种方式
1) “movb type ,%4/n/t” /
得到的成果仅仅 movb type ,…
2)”movb $type,%4/n/t” /
得到的成果是type的地址movb $type,…
3)”movb ” type “,%4/n/t” /
得到的成果是 type的内容,此刻type应该是具有内容的数据,比方”0x89″,”test”,而不能是常量0x89
movb 0x89, …
4)”movb $” type “,%4/n/t” /
这种方式即原代码方式,其间” ” 部分解分出type的“内容”,$ 表明是当即数,得到的成果是
movb $0x89, ….