标志寄存器FLAGS
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
OF |
DF |
IF |
TF |
SF |
ZF |
AF |
PF |
CF |
标志寄存器FLAGS
CF:进位标志 PF:奇偶标志 AF:调整标志
ZF:零标志 SF:符号标志 OF:溢出标志
DF:方向标志 IF:中断允许标志 TF:陷阱标志
r8/r16 |
任意一个8/16位通用寄存器 |
reg |
代表r8或r16 |
seg |
段寄存器 |
m8/m16 |
一个8/16位存储器操作数单元(包括所有主存寻址方式) |
mem |
代表m8或m16 |
i8/i16 |
一个8/16位立即数 |
imm |
代表i8或i16 |
dest |
目的操作数 |
src |
源操作数 |
操作数代号
一、通用数据传送指令
1. MOV
mov reg/mem,imm //注意不允许立即数传至段寄存器
mov reg/mem/seg,reg //不能同时为存储单元
mov reg/seg,mem //IP不能为目的操作数
mov reg/mem,seg //不能直接改变CS的值,会引起程序执行混乱
2. XCHG:交换指令
xchg reg,reg/mem //不能为CS,CS不能更改,不能同时为段寄存器
xchg reg/mem,reg //不能同时为存储器
3. XLAT:换码指令用于将BX指定的缓存区中,al指定的位移处的数据取出赋值给al
xlat label
xlat ;al<-ds:[bx+al]
二、堆栈操作指令
1. PUSH:进栈指令
push r16/m16/seg ;SP<-SP-2,SS:[SP]<-r16/m16/seg //低字节放低地址
2. POP:出栈指令
popr16/m16/seg
三、标志传送指令
(1)标志寄存器传送
1. LAHF ;AH<-FLAGS的低字节
2. SAHF ;FLAGS的低字节<-AH
3. PUSHF ;SP<-SP-2,SS:[SP]<-FLAGS
4. POPF ;FLAGS<-SS:[SP],SP<-SP+2
(2)标志位操作
clc |
CF<-0 |
stc |
CF<-1 |
cmc |
CF<-∽CF |
cld |
DF<-0 |
std |
DF<-1 |
cli |
IF<-0 |
sti |
IF<-1 |
四、地址传送指令
1.LEA有效地址传送指令
LEAr16,mem ;r16<-mem的有效地址EA
2.指针传送指令
LDSr16,mem ;r16<-mem,DS<-mem+2
LESr16,mem ;r16<-mem,ES<-mem+2
五、算数运算符指令
(1)加法指令
1.ADD
addreg,imm/reg/mem
addmem,imm/reg
2.ADC:带进位加法(同上)
3.INC增量指令
increg/mem
(2)减法指令
1.SUB(似ADD)
2.SBB(似ADC)
3.DEC(似INC)
4.NEG:求补指令(取反)
negreg/mem ;reg/mem<-0-reg/mem
5.CMP:将目的操作数减去源操作数,但结果不送回目的操作数。引向标志。
cmpreg,imm/reg/mem ;reg-imm/reg/mem
cmpmem,imm/reg ;mem-imm/reg
(3)乘法指令
1.MUL:无符号数乘法指令
mulr8/m8 ;无符号字节乘:AX<-AL*r8/m8
mulr16/m16 ;无符号字乘:DX.AX<-AX*r16/m16
2.IMUL:有符号数乘法指令
imulr8/m8 ;有符号字节乘
imulr16/m16 ;有符号字乘
(4)除法指令
1.DIV无符号除法
divr8/m8 ;无符号除法:AL<-AX÷r8/m8的商
;AH<-AX÷r8/m8的余数
divr16/m16 ;无符号除法:AX<-DX.AX÷r16/m16的商
;DX<-DX.AX÷r16/m16
2.IDIV有符号除法
idivr8/m8
idivr16/m16
(5)符号扩展指令
1.cbw ;AL符号扩展成AX
2.cwb ;AX符号扩展为DX.AX
(6)十进制调整指令
1.压缩BCD码调整指令
daa ;AL<-将AL中的加和调整为BCD码
;在ADD/ADC AL,X ;语句之后对AL调整
das ;AL<-将AL中的减差调整为压缩BCD码
DAA和DAS指令对OF标志没有定义,按结果影响其他标志
2.非压缩BCD码指令
aaa ;AL<-将AL中的加和调整为非压缩BCD码
aas ;AL<-将AL中的减差调整为非压缩BCD码
aam ;AX<-将AX中的乘积调整为非压缩BCD码
aad ;AX<-将AX中的非压缩码扩展为二进制数
;即:AL<-10*AH+AL,AH<-0
三、位运算类操作
(1)逻辑运算指令
1.逻辑与指令AND
anddest,src ;dest<-dest^src,将两个操作数执行按位的逻辑与运算
2.逻辑或指令OR
ordest,src ;dest<-destVsrc
3.逻辑抑或指令XOR
xordest,src ;dest<-dest⊕src
4.逻辑非指令NOT
notreg,mem ;reg<-∽reg/mem
5.测试指令TEST
testdest,src ;dest^src,对两个操作数执行按位与运算,但结果不回
;到目的数
(2)位移指令
1.逻辑左移shl reg/mem,1/CL ;补0
2.逻辑右移shr reg/mem,1/CL ;补0
3.算术左移sal reg/mem,1/CL ;补0
4.算数术右移sar reg/mem,1/CL ;最高位不变
(3)循环移位指令
1.不带进位
rolreg/mem,1/CL ;左移
rcrreg/mem,1/CL
2.带进位
rclreg/mem,1/CL ;右移
rcrreg/mem,1/CL