3.2 程序编码
3.3 数据格式
C声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节) |
char | 字节 | b | 1 |
short | 字 | w | 2 |
int | 双字 | l | 4 |
long int | 双字 | l | 4 |
long long int | – | – | 4 |
char * | 双字 | l | 4 |
float | 单精度 | s | 4 |
double | 双精度 | l | 8 |
long double | 扩展精度 | t | 10/12 |
3.4 访问信息

3.4.1 操作数指示符
类型 | 格式 | 操作数值 | 名称 |
立即数 | $Imm | Imm | 立即数寻址 |
寄存器 | Ea | R[Ea] | 寄存器寻址 |
存储器 | Imm | M[Imm] | 绝对寻址 |
存储器 | (Ea) | M[R[Ea]] | 间接寻址 |
存储器 | Imm(Eb) | M[Imm+R[Eb]] | (基址+偏移量)寻址 |
存储器 | (Eb,Ei) | M[R[Eb]+R[Ei]] | 变址寻址 |
存储器 | Imm(Eb,Ei) | M[Imm+R[Eb]+R[Ei]] | 变址寻址 |
存储器 | (,Ei,s) | M[R[Ei]·s] | 比例变址寻址 |
存储器 | Imm(,Ei,s) | M[Imm+R[Ei]·s] | 比例变址寻址 |
存储器 | (Eb,Ei,s) | M[R[Eb]+R[Ei]·s] | 比例变址寻址 |
寄存器 | Imm(Eb,Ei,s) | M[Imm+R[Eb]+R[Ei]·s] | 比例变址寻址 |
3.4.2 数据传送指令
指令 | 效果 | 描述 |
MOV S, D | D ← S | 传送 |
movb movw movl | 传送字节 传送字 传送双字 | |
MOVS S, D | D ← 符号扩展(S) | 传送符号扩展的字节 |
movsbw movsbl movswl | 将做了符号扩展的字节传送到字 将做了符号扩展的字节传送到双字 将做了符号扩展的字传送到双字 | |
MOVZ S, D | D ← 零扩展(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, D | D ← &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位乘法 |
cltd | R[%edx]:R[%eax] ← SignExtend(R[%eax]) | 转为四字 |
idivl S | R[%edx] ← R[%edx]:R[%eax] mod S R[%eax] ← R[%edx]:R[%eax] ÷ S | 有符号除法 |
divl S | R[%edx] ← R[%edx]:R[%eax] mod S R[%eax] ← R[%edx]:R[%eax] ÷ S | 无符号除法 |