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水木清华站∶精华区