在阅读linux/unix内核
源代码的时候,必须先掌握
汇编,大家都知道,
内核代码用的
编译器是
gcc,而gcc采用的是AT&T的汇编格式,与MS的intel有些区别。
BSD爱好者乐园!a-MC2_'~q3x$S一 AT&T的基本语法BSD爱好者乐园!uX|\ d7gsp1v1|
BSD爱好者乐园s`ZJ+W
`语法上主要有以下几个不同.
\,|7cK#w3Xyx0lG8HBSD爱好者乐园$b(x0ur+@nI0P★ 寄存器命名原则BSD爱好者乐园Cc T$U-xq.?
BSD爱好者乐园 c$[(]URG(\AT&T: %eax Intel: eaxBSD爱好者乐园f+z_8fsRu
'd'O|Y6l★ 源/目的操作数顺序
T d!og*n#vBSD爱好者乐园5}i#VgDmEnE:tAT&T: movl %eax,%ebx Intel: mov ebx,eaxBSD爱好者乐园M7K}
Or9z
`q!k+@#B1l★ 常数/立即数的格式
P&l%e l/m7@k"G{iBSD爱好者乐园G:CRz"]8gRGbAT&T: movl $_value,%ebx Intel: mov eax,_value
mG#]K2{s}jd`)s[&jHwy"I把_value的地址放入eax寄存器BSD爱好者乐园3cS;cx$l*P|*~
lGmF$tc(VWAT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d
Y`2PS/pS!Y}Z](b`(E★ 操作数长度标识
9L-{g5M]CBSD爱好者乐园
v/R*u7o p x L;`AT&T: movw %ax,%bx Intel: mov bx,axBSD爱好者乐园Q,oqFW
BSD爱好者乐园 u-d5lw$Y.lL★寻址方式
%p'Ous%T6d#|+F
aBSD爱好者乐园$^yg-v4gRAT&T: immed32(basepointer,indexpointer,indexscale)
DVRa+kRBSD爱好者乐园oku7F3_5^hMIntel: [basepointer + indexpointer*indexscale + imm32)BSD爱好者乐园d-vCiBp6m
3IJJ
R)|H9vmLinux工作于保护模式下,用的是32位线性地址,所以在计算地址时BSD爱好者乐园!M0D3C0^1Jr;_:`1N8r-H
BSD爱好者乐园p9S"S7G'~I不用考虑segment:offset的问题.上式中的地址应为:BSD爱好者乐园;Z^x;r;?
A?eFMJ0Wimm32 + basepointer + indexpointer*indexscaleBSD爱好者乐园)\8A)i\["M!V3|I
BSD爱好者乐园S#}M#S.z3Sa,OBJ0{下面是一些例子:
0FN X6A]5IkeBSD爱好者乐园'rdxl3s*uR★直接寻址BSD爱好者乐园 _lr%QZ~wz
0^m8z`,P9Ij&P!}AT&T: _booga ; _booga是一个全局的C变量BSD爱好者乐园-])B([_Xx9@
BSD爱好者乐园d"l I4k/X HxK注意加上$是表示地址引用,不加是表示值引用.BSD爱好者乐园.y@^&OgH[
BSD爱好者乐园D`R$c/Q&X8k(mY注:对于局部变量,可以通过堆栈指针引用.BSD爱好者乐园/Z9e,v"H%QsvEg!H
kv l5gR CKIntel: [_booga]
e7YF*r}.\-MBSD爱好者乐园?&[cf)rk6X★寄存器间接寻址BSD爱好者乐园 H%wW.w*n
BSD爱好者乐园tMt5`:P:PO;HAT&T: (%eax)
u.TeMA$F0Y%nlBSD爱好者乐园
jZ-Sa%F3AKIntel: [eax]
1{V0gJP6J9Z'k6h{/oCz ITQ*N★变址寻址BSD爱好者乐园eYyI
zGrV
,~&|8z6q ^3lAT&T: _variable(%eax)BSD爱好者乐园oT,_3H"@i
zq%?)a
I
x0~dIntel: [eax + _variable]BSD爱好者乐园7mP X3b+V_+l[
BSD爱好者乐园B$`.G4nksz.xM4GlAT&T: _array(,%eax,4)BSD爱好者乐园6J"\G8fV`.I
|.z%R&puIntel: [eax*4 + _array]
~Q-Q#{K*U1jBSD爱好者乐园4k-vf z^sAT&T: _array(%ebx,%eax,8)BSD爱好者乐园 u/_uVS
M$PvH}(@'K)^.EhV7AIntel: [ebx + eax*8 + _array]
"@:yPNY0}n,cuz%CBSD爱好者乐园I1xM
S"} AT(FC
BSD爱好者乐园.gyI1o;d8A;M#[W ^二 基本的行内汇编
?4i RK,B3|BSD爱好者乐园!VO/Kw-|2UI!K5z基本的行内汇编很简单,一般是按照下面的格式
W_
S o tBSD爱好者乐园``J-s5@b5y4kasm("statements");BSD爱好者乐园k*b9ar5nm7oSG/{+`
BSD爱好者乐园X2kAg4\_j7c例如:asm("nop"); asm("cli");
T*W`$N
wKOG)QBSD爱好者乐园@YEaV%v6]asm 和 __asm__是完全一样的.
X/swb%v7k-z gH5\;f如果有多行汇编,则每一行都要加上 "\n\t"BSD爱好者乐园n&~+g-\
~1M!^T
s4{},f
BSD爱好者乐园 W R|4i8Vf!M例如:
amG%mrcd4TE5B