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