BBS水木清华站∶精华区
发信人: mephisto (魔鬼*修心养性*重新做人), 信区: Linux
标 题: Re: 在读Linux源代码遇到的问题
发信站: BBS 水木清华站 (Tue Nov 9 14:18:26 1999)
这个问题请看gcc的inline assemble
info gcc (在turbolinux上须 info --file gcc,土土的说)可以看一下.
在C Extention里面.
【 在 limbo (每日逢君不见君) 的大作中提到: 】
∶ 现在读include\asm-i386\bitops.h的一段代码时,几如读天书,这段代码如下:
∶ extern __inline__ void set_bit(int nr, volatile void * addr)
∶ {
∶ __asm__ __volatile__( LOCK_PREFIX
∶ "btsl %1,%0"
∶ :"=m" (ADDR)
∶ :"ir" (nr));
∶ }
∶ 问题:
∶ (1) __asm__ 是什么意思? 难道和编译器有关?
gcc 's inline assemble
∶ (2) __volatile__ 是什么意思?
告诉笨gcc不要把里面的内存变量优化到寄存器里. 例如有个内存变量是放时钟的,
如果优化到register,再使用register期间那个变量都在内存里变掉了都不知道.
这个何中断有关.gcc是自己没法知道这个的.
∶ (3) LOCK_PREFIX 是什么意思?
asm指令 lock. 在这指令期间不响应中断.
∶ (4) "btsl %1, %0" 似乎是一个汇编指令, 我可以查到这是什么指令吗? 如何查?
就是bts (bit set)亚. 是n86才有的"新"指令. n>=3 ?
∶ (5) :(ADDR) 似乎是 %1 或 %0所对应的值,是对应%1还是%0? "=m"似乎是参数?
对应 %0, "=m" 是说明是一个内存的指针.eg. mov [bx],ax 这要和mov bx,ax
区分开来. "="是说明返回值存放的地方.
"ir"说明是"int register". gcc的inline asm比turbo C的高明,用"ir"就可以暗示
gcc 可以使用任何一个int register作%1, 可以从(eax,ebx,ecx,edx,esi,edi,ebp)挑一个.
便於上下文优化register的变量, Turbo C 就没有这种灵活性,而且保护寄存器上
比较死板.
实例:
-----assume------------
tmp1 = ebx
tmp2 = [esp+0x20]
-------c code-------------
setbit(tmp1,tmp2);
-------genertate asm code-----
lock btsl %ebx,0x20(%esp,1)
∶ (6) 以上这些问题的解决我可以查什么资料呢?
∶ limbo敬上
mephisto敬敬上
--
约塞连怀疑地摇了摇头,拒绝接受丹比的劝告."当我抬起来时,我看到人们全在设法赚钱.我
看不见天堂,看不见圣人,也看不见天使.我只看见人们利用每一次正当的冲动和每一场人类
的悲剧大把大把地捞钱."
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: ab1-84.bjnet.ed]
BBS水木清华站∶精华区