AT&T 指令集
GAS 中每个操作都是有一个字符的后缀,表明操作数的大小。
C 声明 GAS 后缀 大小(字节)
char b 1
short w 2
(unsigned) int / long /
char*
l 4
float s 4
double l 8
long double t 10/12
注意:GAL 使用后缀“l”同时表示 4 字节整数和 8 字节双精度浮点数,这不会产生歧义因为浮点数使用的
是完全不同的指令和寄存器。
"
"
操作数格式:
格式 操作数值 名称 样例(GAS = C 语言)
$Imm Imm
立即数寻址
$1 = 1
Ea R[Ea]
寄存器寻址
%eax = eax
Imm M[Imm]
绝对寻址
0x104 = *0x104
(Ea)
M[R[Ea]]
间接寻址 (%eax)= *eax
Imm(Ea) M[Imm+R[Ea]]
(基址+偏移量)寻址
4(%eax) = *(4+eax)
(Ea,Eb)
M[R[Ea]+R[Eb]]
变址
(%eax,%ebx) = *(eax+ebx)
Imm(Ea,Eb)
M[Imm+R[Ea]+R[Eb]]
寻址
9(%eax,%ebx)= *(9+eax+ebx)
(,Ea,s) M[R[Ea]*s]
伸缩化变址寻址
(,%eax,4)= *(eax*4)
Imm(,Ea,s) M[Imm+R[Ea]*s]
伸缩化变址寻址
0xfc(,%eax,4)=
*(0xfc+eax*4)
(Ea,Eb,s) M(R[Ea]+R[Eb]*s)
伸缩化变址寻址
(%eax,%ebx,4) =
*(eax+ebx*4)
Imm(Ea,Eb,s) M(Imm+R[Ea]+R[Eb]*s)
伸缩化变址寻址
8(%eax,%ebx,4) =
*(8+eax+ebx*4)
注:M[xx]表示在存储器中 xx 地址的值,R[xx]表示寄存器 xx 的值,这种表示方法将寄存器、内存都
看出一个大数组的形式。
"
"
数据传送指令:
指令 效果 描述
movl S,D D <-- S
传双字
movw S,D D <-- S
传字
movb S,D D <-- S
传字节
movsbl S,D
D <-- 符号扩展 S 符号位填充(字节->双字)
movzbl S,D
D <-- 零扩展 S 零填充(字节->双字)