8086指令学习笔记
一、8086CPU中的寄存器
8086CPU中有14个16位的寄存器,按用途分为4类
1.数据寄存器
AX | AH | AL | 累加器 | 常用于运算 |
---|---|---|---|---|
BX | BH | BL | 基址寄存器 | 常用于地址索引 |
CX | CH | CL | 计数(寄存)器 | 常用于计数 |
DX | DH | DL | 数据寄存器 | 常用于数据传递 |
AX,AH,AL
AX是16位寄存器,AH是AX的高8位,AL是AX的低8位
AX是EAX的低16位
2.段寄存器组
CS | 代码段寄存器 |
---|---|
DS | 数据段寄存器 |
SS | 堆栈寄存器 |
ES | 附加段寄存器 |
3.其他寄存器组
IP | 指令指示器 | 指令指针寄存器,与CS配合使用,可跟踪程序的执行过程; |
---|---|---|
IF | 标志寄存器 |
4.指针和变址寄存器
SP | 堆栈指示器 | 堆栈指针,与SS配合使用,可指向目前的堆栈位置 |
---|---|---|
BP | 基址指示器 | 基址指针寄存器,可用作SS的一个相对基址位置 |
SI | 源变址寄存器 | 源变址寄存器可用来存放相对于DS段之源变址指针 |
DI | 目的变址寄存器 | 目的变址寄存器,可用来存放相对于 ES 段之目的变址指针 |
二、8086的指令寻址方式
- 立即寻址
- 寄存器寻址
- 直接寻址
- 寄存器间接寻址
- 寄存器相对寻址
- 基址变址寻址
- 基址变址相对寻址
- 隐含寻址
三、8086的指令系统
数据传送指令
Ⅰ. 通用指令
1.MOV指令
数据传送由“源-> 目的地”
MOV AX, BX ;寄存器寻址
MOV DL, AL ;寄存器寻址
MOV AX, 02 ;源操作数用立即寻址
MOV SI, [BX] ;源操作数寄存器间接寻址
MOV AL, 4[DI] ;源操作数寄存器相对寻址
MOV AX, [BX+2] ;源操作数寄存器相对寻址
MOV [BX][DI],DX ;目的操作数用基址加变址寻址
2.堆栈指令
入栈指令: PUSH
出栈指令:POP
3.字节或字交换指令:XCHG
寄存器之间或寄存器与存储器之间内容交换
xchg ax,cx
4.字节转换指令 XLAT
XLAT [转换表]
常用于查表
Ⅱ.I/O指令
1.八位数据的I/O指令
输入
IN AL, PORT ;输入 port表示某一个具体的I/O端口地址
输出
OUT PORT, AL
2.十六位数据的I/O指令
输入
IN AX, PORT
输出
OUT PORT, AX
Ⅲ.地址目标传送指令
- LEA: 有效地址传送指令
- LDS: 双字指针送寄存器和DS指令
- LES: 双字指针送寄存器和ES指令
1.LEA
将源操作数的偏移地址送到目的操作数中
LEA CX,[2000H];执行结果CX=2000H
;若SI=1000H,BX=2000H
LEA DX,[SI+BX]; 执行结果为DX=3000H
2.LDS
传送一个32位的远地址指针,其中包括一个便宜地址和一个段地址,
前者送寄存器,后者送DS.
;设:DS=C000H,有关存储单元内容为
;(C0010H)=80H
;(C0011H)=01H
;(C0012H)=00H
;(C0013H)=20H
LDS SI,[0010H];执行后SI=0180H,DS=2000H
3.LES
传送一个32位的远地址指针,其中包括一个便宜地址和一个段地址,
前者送寄存器,后者送ES.
;设:DS=B000H,BX=080AH有关存储单元内容为
;(B080AH)=A2H
;(B080BH)=05H
;(B080CH)=00H
;(B080DH)=40H
LES DI,[BX];执行后DI=05A2H,ES=4000H
Ⅳ.标志传送指令
- LAHF:标志送AH指令
- SAHF: AH送标志寄存器指令
- PUSHF:标志入栈指令
- POPF:标志出栈指令
算术运算类指令
1.加法与减法指令
ADD DST,SRC; DST <- DST+SRC
ADC DST,SRC; DST <- DST+SRC+CF
SUB DST,SRC; DST <- DST-SRC
SBB DST,SRC; DST <- DST-SRC-CF
NEG DST ; 0-DST,即取补
2.比较指令
CMP AX,BX;
; 比较后 ZF=1,则AX=BX
; ZF =0,则AX不等于BX
3.增量指令
INC DST; DST+1 -> DST
DEC DST; DST-1 -> DST
4.乘法与除法指令
IMUL SRC;符号数的乘法
;字节运算时,ALXSRC->AX
;字运算时,AX x SRC -> DX与AX
MUL SRC; 无符号数的乘法,其他同上
IDIV SRC;符号数除法
;字节运算时:AX/SRC的商 -> AL; AX/SRC的余数-> AH
;字运算时: DX/SRC的商 -> AX; DX/SRC的余数-> DX
DIV SRC; 符号数除法,其他同上
位操作指令
1.逻辑运算类指令
AND DST,SRC ; DST^SRC -> DST,清CF、OF
;根据结果置SF、ZF、PF,标志AF不定
OR DST,SRT ;或, 标志位设置同上
XOR DST,SRT ;异或, 标志位设置同上
TEST DST,SRT;DST^SRC,仅设置标志位, 标志位设置同上
NOT DST ;取反, 不影响标志位
2.移位指令
SHR DST,CNT; 逻辑右移
SHL/SAL DST,CNT;逻辑/算数左移
SAR DST,CNT;算数右移
3.循环移位指令
ROR DST,CNT; 循环右移
ROL DST,CNT; 循环左移
RCR DST,CNT; 带进位循环右移
RCL DST,CNT; 带进位循环左移
串操作指令
- 串传送
MOVSW ;字传送:SI+(-)2->SI,DI+(-)2->DI
MOVSB ;字节传送:SI+(-)1->SI,DI+(-)1->DI
- 串比较
CMPSW ;字比较:SI+(-)2->SI,DI+(-)2->DI
CMPSB ;字节比较:SI+(-)1->SI,DI+(-)1->DI
- 串扫描
SCASW ;字扫描: AX-(ES:DI),DI+(-)2->DI
SCASB ;字节扫描:AL-(ES:DI),DI+(-)1->DI
- 串取出
LODSW ;字取出: (DS:SI) -> AX,SI+(-)2->SI
LODSB ;字节取出: (DS:SI) -> AL,SI+(-)1->SI
- 串存储
STOSW ;字存储: AX -> (ES:DI),DI+(-)2->DI
STOSB ;字节存储: AL -> (ES:DI),DI+(-)1->DI
控制转移指令
1.无条件转移、电泳和返回指令
- 无条件转移指令JMP
JMP OPRD ;OPRD时转移的目的地址
- 调用和返回
CALL 来电泳一个过程或子程序
CALL NEAR PTR OPRD;段内调用
CALL FAR PTR OPRD ;段间调用
2.条件转移指令
3.循环控制指令
标志处理和CPU控制
1.标志处理指令
指令助记符 | 功能 | 指令名称 |
---|---|---|
STC | CF <- 1 | 进位标志置1 |
CLC | CF <- 0 | 进位标志置0 |
CMC | CF <- | 进位标志取反 |
STD | DF <- 1 | 方向标志置1 (地址减量) |
SLD | DF <- 0 | 方向标志置0 (地址增量) |
STI | IF <- 1 | 中断允许标志置1 (开中断) |
CLI | IF <- 0 | 中断允许标志置0 (关中断) |
2.外部同步指令
- ESC指令
- 等待指令WAIT
- 封锁总线指令LOCK