· 指令系统
INTEL8086/8088CPU指令系统的指令可以分为六大类
1.传送类指令
2.算术运算类指令
3.位操作类指令
4.串操作类指令
5.程序转移类指令
6.处理器控制类指令
若从指令的格式划分,可以分为三种:
1.双操作数指令: OPR DEST SRC
2.单操作数指令: OPR DEST
3.无操作数指令: OPR
特别地,对无操作数指令又分2种情况:<1>指令不需要操作数,如暂停指令HLT <2>在指令格式中没操作数,但隐含指明了操作数的存放地方,如PUSHF。
我们接下来对它们进行分析
一.传送类指令
传送指令的作用是将数据信息或地址信息传送到一个寄存器或存储单元中,可以分为以下四种情况
<1>.通用数据传送指令
指令格式:MOV DEST, SRC MOV 目的操作数 源操作数 (它们的长度必须相同)
作用:将源操作数指定的内容传到目的操作数
MOV指令分为以下几种情况:
(1)立即数传送到通用寄存器或存储单元
例:MOV AH 10H
MOV AX, 2345H
MOV M-BYTE, 64H
MOV M-WORD, 2364H
需要注意的是:立即数只能作为源操作数,同时它不能传送给段寄存器
(2)寄存器之间进行传送
例:MOV AH, CH
MOV DS, AX
MOV ES, BX
MOV AX, CS
MOV CS, AX 错误
注意:段寄存器CS只能作为源操作数,不能作为目标操作数,段寄存器之间不能直接传送
(3)寄存器与存储单元之间进行传送
例:MOV AL, [SI]
MOV [DI], AH
MOV AX,10[BX]
MOV TABLE[BP], BX
MOV DS, [SI][BX]
MOV [BX], [BP][SI]错误 原因是存储单元之间不能直接传送数据
<2>.交换指令
指令格式:XCHG DEST, SRC
作用:源操作数和目的操作数两者内容相互交换
指令对标志寄存器各位无影响
另外,数据交换可以在寄存器之间或寄存器与存储器单元之间进行。但是不能在存储单元之间直接进行数据交换
寄存器只能使用通用寄存器。
若想实现存储器之间交换可引入一个中介寄存器。
<3>.标志传送指令
对标志寄存器进行存取的指令有4条,它们都是无操作数指令,即指令隐含指定标志寄存器,AH寄存器或堆栈为操作数。
(1)取标志寄存器指令
指令格式:LAHF
作用:将标志寄存器的低8位送如AH寄存器,即将标志SF,ZF,AF,PF,CF分别送入AH的第7,6,4,2,0位,而AH的第5,3,1位不确定
(2)存储标志寄存器指令
指令格式:SAHF
作用:将寄存器AH种的第7,6,4,2,0位分别送入标志寄存器的SF,ZF,AF,PF,CF各标志位。而标志寄存器高8位中的各标志位不受影响。
(3)标志进栈指令
指令格式:PUSHF
作用:先将堆栈指针SP减2,使其指向堆栈顶部的空字单元,然后将16位标志寄存器的内容送SP指向的字单元
(4)标志出栈指令
指令格式:POPF
作用:将由SP指向的堆栈顶部的一个字单元的内容送入标志寄存器,然后SP的内容加2
<4>.地址传送指令
之类指令有3条,它们的作用是将存储单元的地址送寄存器。
(1)装入有效地址
格式:LEA DEST, SRC
其中:源操作数SRC必须是一个字节或字存储器操作数(地址),DEST必须是一个16位通用寄存器。
作用:将SRC存储单元地址中的偏移量,即有效地址EA传送到一个16位通用寄存器中。
指令指向对各标志寄存器无影响
例1:LEA AX, [BX][SI]
注意:它不是将BX和SI所寻址的存储单元的内容送入AX
例2 比较指令 LEA BX, DS:[23H]与MOV BX, DS:[23H]的功能
如图
(2)装入地址指针指令
格式:LDS DEST, SRC
LES DEST, SRC
其中:DEST是任意一个16位通用寄存器。SRC必须是一个存储器操作数。
作用:把SRC存储单元开始的4个字节单元的内容(32位地址指针)送入DEST通用寄存器和段寄存器DS(LDS指令)或ES(LES指令),其中低字单元内容为偏移量送通用寄存器,高字单元内容为段基值送DS或ES。
例:LDS SI, TABLE[BX]
设TABLE的值为0A02H,BX=34H,DS=2030H
解
二.算术运算类指令
8086/8088指令系统中有加减乘除指令,这些指令可以对字节数据或字数据进行运算
参加运算的数可以是无符号数,也可以是带符号数。带符号数用补码表示
参加运算的数可以是二进制数,也可以是十进制数BCD码表示
1.加法指令
指令格式:ADD DEST, SRC
功能:目的操作数和源操作数相加,其和存放到目的操作数中,而源操作数内容保持
不变,即DEST<=(DEST)+(SRC)
根据相加的结果将影响到标志寄存器CF,PF,AF,ZF,SF,OF.
DEST只能是通用寄存器或存储器操作数。不能是立即数。
SRC可以是通用寄存器,存储器或立即操作数
DEST和SRC不能同时为存储器操作数
ADD指令可以是字节操作数相加,也可以是字操作数相加
例
(1) ADD AX, CX
功能:将寄存器AX的内容与CX的内容相加,结果送到AX中
2.带进位的加法指令
指令格式:ADC DEST, SRC
该指令的功能和ADD基本相同,所不同的是其结果的值还要加上进位标志CF的值,即
DEST<=(DEST)+(SRC)+CF
并根据相加的结果将影响到标志寄存器CF,PF,AF,ZF,SF,OF.
例 :计算12349678H+377425H
MOV AX, 1234H
MOV BX, 9678H
ADD BX, 7425H
ADC AX, 37H
指令执行后,结果的高16位在AX,低16位在BX中
这里可能不太理解,那么我来解释一下ADD和ADC的区别
ADD 是求两个指定整数的和,而 ADC 除了两个指定整数以外,还会加上 C(进位)状态的值。需要 ADC 指令,是因为如果要加的整数长于微处理器每次能加的位元数,就要分开来加,高位字节的结果取决于低位字节相加时有没有进位。 举例:假如有8位元微处理器每次只能加一个字节,如果我们要加两个 16 位元整数:00110101 11001010 + 00010100 01111101 先用 ADD 加 11001010 和 01111101,得 01000111,有进位,状态 C 设为 1再用 ADC 加 00110101 和 00010100 和 状态C(现在是1),得 01001010 所以和是 01001010 01000111
3.加1指令
指令格式:INC DEST
功能: DEST<=(DEST)+1
目的操作数可以是任意的8位,16位通用寄存器或存储器操作数。目的操作数被视为带符号二进制数
根据指令执行结果设置PF,AF,ZF,SF,OF标志但不影响CF。INF指令主要用于某些计数器计算和修改地址指针。
例: INC CL
INC COUNT
INC SI
4.减法指令
指令格式:SUB DEST, SRC
功能:目的操作数和源操作数相减,其差存放到目的操作数中,而源操作数内容保持
不变,即DEST<=(DEST)-(SRC)
根据相减的结果将影响到标志寄存器CF,PF,AF,ZF,SF,OF.
DEST只能是通用寄存器或存储器操作数。不能是立即数。
SRC可以是通用寄存器,存储器或立即操作数
DEST和SRC不能同时为存储器操作数
例 SUB AX, BX
SUB AH, 10H
SUB DX,DA-WORD
SUB DA-BYTE,BL
注意:减法指令对借位标志的影响,若采用变减为加的运算方法,则参生的进位与CF标志结果相反。
5.带借位的减法
指令格式: SBB DEST, SRC
该指令的功能和SUB基本相同,所不同的是其结果的值还要减上进位标志CF的值,即
DEST<=(DEST)-(SRC)-CF
注意:该CF的值是本条指令执行前的结果
SBB指令在使用上与ADC类似,主要用于长度大于16位的数相减,即将低16位相减的结果引入高位部分的减法中
并根据相减的结果将影响到标志寄存器CF,PF,AF,ZF,SF,OF.
6.减一指令
指令格式:DEC DEST
功能与加一指令相反
7.求负数指令
指令格式: NEG DEST
功能:用零减去目的操作数的内容,并送回目的操作数,即:DEST<=0-(DEST)DEST可以是任意一个8位或16位的通用寄存器或存储器操作数,被视为带符号的操作数由于机器中带符号数用补码表示,求操作数的负数就是求补操作。因此,NEG指令也叫取补指令。NEG指令将影响标志PF、AF、ZF、SF、CF和OF
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的。
例1 设AL中中存放一个正数AL=25H,BL中存放一个负数 BL=-5 8H求他们的相反数
NEG AL
NEG BL
三.位操作指令