|
Jan
11
|
|
先说一下8086/8088的指令系统
可分为六个功能组:
(1)数据传送 (2)算术运算 (3)逻辑运算
(4)串操作 (5)程序控制 (6)处理器控制
指令语句可由四部分组成,一般格式:
[标号:] 指令助记符 [操作数1 [,操作数2]] [;注释]
数据传送指令
1. 传送指令
MOV DST,SRC
源操作数(SRC)可以是累加器,寄存器,存储单元以及立即数
目的操作数(DST)可以是累加器,寄存器,和存储单元。
传送不改变源操作数
(1)CPU内部寄存器之间的数据传送,如
MOV AH,AL
MOV DL,DH
MOV BP,SP
MOV AX,CS
SRC和DST不能同时是段寄存器
DST不能是CS
SRC和DST都不能是IP
(2)立即数送至通用寄存器或存储单元,如
MOV AL 3
MOV SL,-5
MOV VARB,-1
MOV VARW,3456H
MOV [SI],6543H
立即数不能直接送段寄存器
立即数永远不能作为目的操作数
(3)寄存器与存储器间的数据传送,如
MOV AX,VARW
MOV BH,[DI]
MOV DL,ES:[SI+3]
MOV VARB,DL
MOV DS:[BP],DL
MOV VARW,DS
MOV ES,VARW
注意:
源操作数和目的操作数的类型要一致(8位送8位,16位送16位)
除串操作指令外,源操作数和目的操作数不能同时是存储器操作数(要在两个存储单元间传送数据,可以利用通用寄存器过渡,也可用于段寄存器间的数据传送)
2. 交换指令
XCHG OPRD1,OPRD2
OPRD1和OPRD2或以是通用寄存器和存储单元,但不包括CS,也不能同时是存储单元,还不能有立即数。
3. 地址传送指令
(1)有效地址传送指令LEA
LEA REG,OPRD
把OPRD的有效地址传送到寄存器REG
操作数OPRD必须是存储器操作数
操作数REG必须是一个16位的通用寄存器
(2)LDS
LDS REG,OPRD
执行的操作:
(REG)<- (SRC)
(DS)<- (SRC+2)
OPRD必须是32位的存储器操作数
REG可以是一个16位的通用寄存器,通常是变址寄存器(SI,DI)或指针寄存器(SP,BP)
即把OPRD地址对应的双字的高字送DS,低字送REG。
(3)LES
LES REG,OPRD
执行的操作:
(REG)<- (SRC)
(ES)<- (SRC+2)
要求同上。
4.堆栈操作指令
堆栈是一段内在区域,栈底的地址较大,栈顶的地址较小。
堆栈的段值在SS中,SP始终指向栈顶
工作方式:后进先出
堆栈的存取必须以字为单位(16位)
(1)进栈指令
PUSH SRC
执行的操作: (SP)<- (SP)-2
SRC可以是通用寄存器和段寄存器,也可以是字存储单元。
(2)出栈指令
POP DST
执行的操作:(SP)<- (SP)+2
从栈顶弹出一个字到DST
DST可以是通用寄存器和段寄存器(CS除外!),也可以是字存储单元
POP和PUSH可以使用除立即数以外的其他寻址方式
5. 标志操作指令
(1)标志传送指令
LAHF
把FLAG的低8位(CP(0),PF(2),AF(4),ZF(6),SF(7)),传送到寄存器AH的指定位。
SAHF
与LAHF相反,把AH的指定位传送给FLAG的低8位。
PUSHF
把FLAG压栈
POPF
把栈顶的字传送到FLAG
(2)标志位操作指令
CLC
清进位标志:CF=0
STC
置进位标志:CF=1
CMC
进位标志取反:CF=NOT CF
CLD
清方向标志:DF=0
STD
置方向标志:DF=1
CLI
清中断允许标志:IF=0
STI
置中断允许标志:IF=1

