第3章 程序的机器级表现

Avatar photo

3.2 程序编码

3.3 数据格式

C声明Intel数据类型汇编代码后缀大小(字节)
char字节b1
shortw2
int双字l4
long int双字l4
long long int4
char *双字l4
float单精度s4
double双精度l8
long double扩展精度t10/12
C语言数据类型在IA32中的大小。

3.4 访问信息

3.4.1 操作数指示符

类型格式操作数值名称
立即数$ImmImm立即数寻址
寄存器EaR[Ea]寄存器寻址
存储器ImmM[Imm]绝对寻址
存储器(Ea)M[R[Ea]]间接寻址
存储器Imm(Eb)M[Imm+R[Eb]](基址+偏移量)寻址
存储器(Eb,EiM[R[Eb]+R[Ei]]变址寻址
存储器Imm(Eb,Ei)M[Imm+R[Eb]+R[Ei]]变址寻址
存储器(,Ei,s)M[R[Eis]比例变址寻址
存储器Imm(,Ei,s)M[Imm+R[Eis]比例变址寻址
存储器(Eb,Ei,s)M[R[Eb]+R[Eis]比例变址寻址
寄存器Imm(Eb,Ei,s)M[Imm+R[Eb]+R[Eis]比例变址寻址

3.4.2 数据传送指令

指令效果描述
MOV S, DD ← S传送
movb
movw
movl
传送字节
传送字
传送双字
MOVS S, DD ← 符号扩展(S)传送符号扩展的字节
movsbw
movsbl
movswl
将做了符号扩展的字节传送到字
将做了符号扩展的字节传送到双字
将做了符号扩展的字传送到双字
MOVZ S, DD ← 零扩展(S)传送零扩展的字节
movzbw
movzbl
movzwl

pushl S

popl D
将做了零扩展的字传送到字
将做了零扩展的字节传送到双字
将做了零扩展的字传送到双字
R[%esp] ← R[@esp]-4;
M[R[%esp]] ← S
D ← M[R[%esp]];
R[%esp] ← R[@esp]+4




将双字压栈

将双字出栈

3.5 算术和逻辑操作

加载有效地址(load effective address)通常用来执行简单的算术操作。比如:
leal 6(%eax), %eax 就相当于 x+=6;

指令效果描述
lead S, DD ← &S加载有效地址
INC D
DEC D
NEG D
NOT D
D ← D + 1
D ← D – 1
D ← – D
D ← ~ D
加1
减1
取负
取补
ADD S, D
SUB S, D
IMUL S, D
XOR S, D
OR S, D
AND S, D
D ← D + S
D ← D – S
D ← D * S
D ← D ^ S
D ← D | S
D ← D & S



异或

SAL k, D
SHL k, D
SAR k, D
SHR k, D
D ← D << k
D ← D << k
D ← D >>A k
D ← D >>L k
左移
左移(等同于SAL)
算术右移
逻辑右移

3.5.2 一元操作和二元操作

一元操作:只有一个操作数,既是源又是目的。
二元操作:第二个操作数既是源又是目的。movl和算术、逻辑指令一样,两个操作数不能同时是存储器位置

3.5.5 特殊的算术操作

指令效果描述
imull S
mull S
R[%edx]:R[%eax] ← S × R[%eax]
R[%edx]:R[%eax] ← S × R[%eax]
有符号全64位乘法
无符号全64位乘法
cltdR[%edx]:R[%eax] ← SignExtend(R[%eax])转为四字
idivl SR[%edx] ← R[%edx]:R[%eax] mod S
R[%eax] ← R[%edx]:R[%eax] ÷ S
有符号除法
divl SR[%edx] ← R[%edx]:R[%eax] mod S
R[%eax] ← R[%edx]:R[%eax] ÷ S
无符号除法
imull乘积存在%edx(高32位)和%eax(低32位)。

3.6 控制