8088指令系统.docx
- 文档编号:26597736
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:32
- 大小:57.42KB
8088指令系统.docx
《8088指令系统.docx》由会员分享,可在线阅读,更多相关《8088指令系统.docx(32页珍藏版)》请在冰豆网上搜索。
8088指令系统
第四章8086指令系统
只有硬件的计算机称为裸机,它是不能工作的,若要工作,必须要事先编好程序,也称为软件。
计算机是硬件与软件共同组成的不可分割的系统。
程序是由指令组成的。
因此,要理解计算机的工作原理,掌握它的指令系统是必不可少的。
指令是控制计算机去完成某种操作的命令,与计算机的硬件有关,根据设计使某型计算机所具有的指令的集合便是计算机的指令系统,因此不同类型的计算机有不同的指令系统。
指令的表达形式:
机器码指令和汇编语言指令。
①用二进制代码表示的指令称为机器码指令或目标代码指令,这种形式的指令能够直接被计算机识别和执行。
8086的指令一般有二到六个字节,较复杂,我们不作介绍。
②因为机器码指令难以记忆和编程,就将指令操作功能的英文缩写作为指令的符号,称为助记符。
用助记符表示的指令便于记忆和编程,但不能被计算机直接识别和执行,必须经过汇编转换为机器码后才能执行,汇编语言指令由此而得名。
汇编语言指令与机器码指令有一、一对应关系,用汇编语言指令进行编程能够充分开发计算机硬件资源,它的程序目标代码短,运行速度快,因此,汇编语言是面向机器的语言,它在自动控制、智能化仪器仪表、监测等领域应用非常广泛。
8086指令系统兼容了8080的全部指令,这部分对8位微处理器的指令是处理字节的,此外8086还有自已所特有的对字或字符串的处理指令,以及对带符号数的运算指令,中断指令和协处理器的指令等。
§4.1汇编语言指令的格式与寻址方式
一、8086汇编语言指令的格式
指令格式是指编写指令是的书面表达形式,一条完整的汇编语言指令由四个部分(字段)组成:
[标号]:
(指令助记符)[操作数][,操作数][;注释]
各部分间用空格或规定的标点符号隔开,方括号内的字段为可选项,圆括号内的字段为关键字,必选项。
1、标号是给该指令所在地址取的名字,必须后跟“:
”,它可以缺省,是可供选择的标识符。
8086汇编语言中的标号按以下规则设定:
(1)标识符由字母(a~z,A~Z),数字(0~9)或某些特殊字符(@,—,?
)组成;
(2)第一字符必须是字母(a~z,A~Z)或某些特殊字符号(@,—,?
)但“?
”不能单独作标识符;
(3)标号有效长度为31个字符,若超过31个字符,则只保留前面的31个字符为有效标识符。
如:
START01;MY—COOE;?
MORE—35都是有效的标号。
而:
4LOOP;START=3;?
;A/BF都是无效的标号。
2、指令助记符是指令功能的代表符号,它是指令语句中的关键字段,不可缺省,它表示本指令的操作功能。
8086的指令助记符前面可以加一个或多个“前缀”,从而实现某些附加操作。
3、操作数是参加指令操作的数据,指令若出现两个操作数,它们必须用逗号“,”分开,操作数也可以用表达式表示。
操作数字段可以缺省。
指令中参与操作的数据叫源操作数,而表示指令操作结果的数据叫目的操作数。
存放源操作数的地址叫源地址,存放目的操作数的地址叫目的地址。
4、注释部分是可选项,允许缺省,如果带注释则必须用“;”,注释本身只用来对语句功能加以解释,给阅读程序带来方便,汇编程序对它不做任何处理。
二、8086的寻址方式
计算机指令大多是对数据进行操作。
计算机中的数据是以多种方式存放的,这样做的目的是为了增加计算机处理数据的能力。
对于数据存放的方式必须预先约定,根据这些约定,机器才能找到它们并进行处理。
所谓寻址方式,就是寻找操作数所在地址的方式。
在这里,地址泛指一个存储单元或某个寄存器。
寻址方式的多少是反映指令系统功能强弱的一个重要指标。
8086指令系统的寻址方式有七种。
1、立即数寻址:
指令的操作数本身就放在指令中,这类指令的寻址方式叫立即寻址方式。
例如:
MOVAL,05H
;将数05H送入AL;
MOVAX,3064H
;将数3064H送AX,其中AH中为30H,AL中为64H。
采用立即数寻址方式的指令主要用来对寄存器赋值。
因为操作数可以直接从指令中取得,不需要运行总线周期,因此立即寻址方式的特点是速度快。
立即数可以是8位,也可以是16位;规定立即数只能是整数,不能是小数、变量或者其它类型的数据。
另外还须注意,立即数只能作源操作数。
2、寄存器寻址:
操作数在CPU的内部寄存器中,在指令中指出该寄存器名,这种寻址方式是寄存器寻址方式。
例如:
MOVSS,AX
;将AX的内容传给SS;
ROLAH,1
;将AH中的内容循环左移一位。
对16位操作数来说,寄存器可以为AX、BX、CX、DX、SI、DI、SP或者BP,对8位操作数来说,寄存器可以为AH、AL、BH、BL、CH、CL、DH、DL。
采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,也不需使用总线周期,因此,执行速度快。
一条指令中,可以对源操作数采用寄存器寻址方式,也可以对目的操作数采用寄存器寻址方式,还可以两者都用寄存器寻址方式。
3、直接寻址:
操作数放在存储器中,指令直接指出存储单元的有效地址。
直接寻址是对存储器进行访问时可采用的最简单方式。
地址用4位十六进制数表示,外加方括号,区别于立即寻址。
例如:
MOVAX,[3100H];将DS段的3100H和3101H两单元的内容送AX中。
设DS为6000H,则本指令在执行时,将绝对地址为63100H单元的内容送AL;将绝对地址为63101H单元的内容送AH。
注意:
采用直接寻址时,若没有前缀指明操作数在哪一段,则默认段寄存器是数据段寄存器DS;若对其它段寄存器所在的存储区进行寻址,则指令前必须加前缀指出段寄存器名。
例如:
CS∶MOVBX,[2000H];将CS段的2000H和2001H两单元内容送BX。
设CS为2100H,则本指令在执行时,将绝对地址为23000H单元的内容送BL;将绝对地址为23001H单元的内容送BH。
4、寄存器间接寻址:
操作数在存储器中,存储单元的有效地址放在指令指出的寄存器中,即指令给出的寄存器中放的是操作数所在存储单元的有效地址。
寄存器外加方括号,区别于寄存器寻址。
所用的寄存器可以为BX、SI、DI和BP之一。
和直接寻址一样,若指令没有前缀指明具体的段寄存器,则默认为DS,若寄存器为BP时,则对应的段寄存器为SS。
例:
MOVBX,[DI]
设DS=6000H,DI=2000H,则本指令在执行时将绝对地址为62000H单元内容送BL;将绝对地址为62001H单元内容送BH。
例:
ES∶MOVCX,[BX]
设:
ES=3000H,BX=4000H,则本指令在执行时将绝对地址为34000H和34001H两单元的内容送CX。
5、基址寻址:
指令中指定的基址寄存器的内容与位移量相加,其和作为操作数的有效地址。
所用寄存器为BX,BP,位移量可以是8位,也可以是16位。
[BX]8位位移量
EA=+
[BP]16位位移量
用BX寄存器进行基址寻址时,默认的段寄存器为DS;以寄存器BP进行间接寻址时,操作数默认在堆栈段中。
例:
MOVAX,[BP+COUNT]
设SS=5000H,BP=3000H,COUNT=2040H则本指令在执行时将绝对地址为55040H和55041H两单元的内容送AX。
6、变址寻址:
指令指定的变址寄存器的内容与位移量相加,其和作为操作数的有效地址。
所用寄存器为SI和DI,它们分别称为源变址寄存器和目的变址寄存器。
这两个寄存器中的内容在串操作指令执行过程中会自动修改,以指向下一个操作数。
[SI]8位位移量
EA=+
[DI]16位位移量
例:
MOVAX,[DI+COUNT]
设DI=1094H,COUNT=0450H是位移量,DS=3200H,则本指令在执行时将存储器中绝对地址为334EAH和334EBH两单元的内容送AX。
7、基址加变址寻址:
指令指定的基址寄存器、变址寄存器二者内容相加,再加指令中的位移量,其和作为操作的有效址。
基址寄存器为BX,BP,变址寄存器为SI,DI,位移量为8位或16位,利用这种寻址方式的指令也可以没有位移量。
[BX][SI]8位位移量
EA=++
[BP][DI]16位位移量
由于SI、DI中的内容可以改变,因此这种寻址方式使用起来很灵活,特别是为堆栈中数组的访问过程提供了极大的方便。
例:
MOVAX,[BX+DI+MASK]
设DS=3000H,BX=1346H,DI=0500H,MASK=1234H,则本指令在执行时将绝对地址为32A7AH和32A7BH两单元内容送AX。
如图所示,在访问堆栈数组时,可以在BP中存放堆栈顶的地址,位移量表示数组第一个元素到栈顶的距离,变址寄存器SI(也可为DI)指出数组元素。
§4.2数据传送类指令
传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,负责把数据、地址或立即数传送到寄存器或存储单元。
我们把这类指令分为四种。
一、通用数据传送指令:
8086提供方便灵活的通用的传送操作,适用于大多数操作数。
通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数的指令。
这种指令包括最基本的传送指令MOV,堆栈指令PUSH和POP,数据交换指令XCHG。
1、传送指令:
MOVdest,src(src为源,dest为目的,后同)。
功能:
实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或者内存单元。
例:
MOVDL,CH
;CH中的8位数送DL
MOVAX,CX
;将CX的内容传送给AX
MOVAX,03FFH
;将立即数03FFH送AX
MOVWORDPTR[SI],057BH
;立即数057BH送SI和SI+1所指两个单元。
这里的PTR是一个汇编操作符,与前面的WORD一起,意思是从SI地址中取一个字而不是一个字节。
2、堆栈操作指令:
堆栈是从内存中划分出来的一部分存贮空间,用于存放程序执行过程中的某些特定数据。
向堆栈中存数叫入栈,从堆栈中取数叫出栈。
第一个存入堆栈的数据的地址叫栈底,最后一个进入堆栈的数据的地址叫栈顶。
SP叫堆栈指针寄存器,总是指向栈顶。
入栈指令:
PUSHsrc
功能:
将SP值减2,然后将源操作数送至由SP所指向的栈顶。
出栈指令:
POPdest
功能:
将SP所指栈顶内容送至目的单元,然后SP值加2。
注意8086的栈操作指令以字为单位进行操作,不允许以字节为单位进行操作。
且POP指令中的目的操作数可以是除代码段寄存器CS之外的其它寄存器和存储器。
例:
设AX=1122H,SS=0200H,SP=0008H,BX=3344H
执行PUSHAX后,则SP=0006H,存储单元02007H的内容为11H,02006H单元的内容为22H。
再执行POPBX后,(SP)=0008H,(BX)=1122H,
堆栈中的内容是按先进后出的原则进行传送的,因此在保存和恢复内容时,要按照对称的次序执行一系列压入指令和弹出指令。
3、交换指令:
XCHGdest,src
功能:
将源地址单元的内容与目的地址单元的内容相互交换。
交换指令可以实现字节交换,也可以实现字交换,交换过程可以在CPU内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但两个内存单元之间不能直接交换。
例:
XCHGAL,BH
;AL和BH之间的字节内容交换
XCHGAX,DX
;AX和DX之间的字内容交换
XCHGBX,[1000H]
;BX和1000H及10001H两单元内容交换。
注意:
存储器之间不能交换,两个操作数中必须有一个在寄存器中;段寄存器不能作为一个操作数;
交换指令不影响标志位。
4、换码指令:
XLAT
功能:
将BX和AL中内容的和为目的地址,取出其存储单元的内容送入AL。
可以使累加器中的某个值变换为内存单元中的某个值,一般用来实现代码的转换,故称换码指令,也可称查表指令。
该指令的操作数缺省。
例:
将存储单元200AH中的内容送累加器
执行:
MOVBX,2000H
MOVAL,0AH
XLAT
该指令用作查表时,必须事先建立好表格,该表最大容量为256字节。
二、目标地址传送指令:
这是一种专用于传送地址码的指令,可用来传送操作数的段地址和偏移地址,共包含三条指令。
1、取有效地址指令:
LEAdest,src
功能:
将存储器地址送到一个寄存器,而不是传送其内容。
该指令中要求源操作数必须为内存单元地址,目的操作数必须为16位的通用寄存器。
例:
LEAAX,[2000H]
;将2000H单元的偏移量送AX,(AX)=2000H
LEABX,[BP+SI]
;指令执行后,BX的内容为BP+SI的值
LEASP,[0100H]
;使堆栈指针SP为0100H
2、地址指针装入DS和另一个寄存器的指令:
LDSdest,src
功能:
把四个字节的地址指针(包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到DS中。
该指令中源操作数必须是存储单元地址。
例:
执行LDSDI,[2230H]
将2230H和2231H中的地址偏移量送到DI,将2232H和2233H中的段值送到DS寄存器。
3、地址指针装入ES和另一个寄存器的指令:
LESdest,src
功能:
把四个字节的地址指针(包括一个段基址和一个偏移量)传送到两个目的寄存器,其中后两个字节的内容即段基址一定送ES中,该指令中源操作数也必须是存储单元地址。
LES指令与LDS指令的操作基本相同。
三、标志位传送指令:
这种指令的执行,可读出当前标志寄存器的内容,也可对标志寄存器设置新的值。
这种指令共四条。
1、读取标志指令:
LAHF
功能:
将标志寄存器中的低八位传送到AH中,如图所示。
FLAG
OF
DF
IF
TF
SF
ZF
AF
PF
CF
AH
D7
D6
D4
D2
D0
LAHF指令的功能
2、设置标志指令:
SAHF
功能:
将AH寄存器的相应位传送到标志寄存器的低8位,与上条指令功能相反,即将上图中的箭头方向反过来。
以上两条指令是为兼容8位8080而设置的。
3、将标志寄存器的内容压入堆栈指令:
PUSHF
功能:
将标志寄存器的值压入堆栈顶部,SP值减2,且标志寄存器的内容不变。
4、对标志寄存器的弹出堆栈指令:
POPF
功能:
从堆栈顶弹出一个字送到标志寄存器中,同时SP的值加2。
PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保护主程序标志和恢复主程序标志的作用。
四、输入/输出数据传送指令:
用来完成累加器(AL/AX)与I/O端口之间的数据传送功能。
1、输入指令:
INacc,Port(acc为累加器,Port为端口,下同)
功能:
从一个8位端口(或一个16位端口)读入一个字节到AL中(读入一个字到AX中)。
2、输出指令:
OUTPort,acc
功能:
将AL中的一个字节写入一个8位端口(或将AX中的一个字写到一个16位端口中)。
注意:
若为8位端口地址,可用数据直接表示端口;若为16位端口地址,则必须将地址数据送入DX中,指令中用DX表示端口地址。
例1:
实现(29H)、(28H)端口内容→(DATA_WORD)
INAX,28H
MOVDATA_WORD,AX
例2:
从端口3FCH送一个字到AX寄存器
MOVDX,3FCH
INAX,DX;(AL)←(3FCH),(AH)←(3FDH)
例3:
实现将(AL)→(05H)
OUT05H,AL;(05H)←(AL)
例4:
实现将(1000H)→(0500H)
MOVAL,1000H
MOVDX,0500H
OUTDX,AL
§4.3算术运算类指令
算术运算是计算机的最基本的运算之一,8086CPU具有完备的加、减、乘、除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。
特点:
①大部分都影响标志位,不同指令影响不同:
(1)加、减法指令影响SF,ZF,AF,PF,CF,OF;
(2)加1和减1指令不影响CF;
(3)乘法指令影响CF,OF;
(4)除法指令使大部分标志位的状态不确定;
(5)对BCD码调整指令对标志位的影响不同;
(6)转换指令对标志位无影响。
②都可以用于字节、字的运算。
③双操作数指令除源为立即数外,其余必须有一个操作数为寄存器;单操作数指令不能为立即数。
一、加法指令
1、不带进位位的加法指令:
ADDdest,src
功能:
用来执行目的操作数与源操作数相加操作,结果放目的地址。
例:
ADDCL,10H
;CL内容与10H相加,结果放CL中
ADDCX,1000H
;CX中内容与1000H相加,结果放CX中
ADDDX,SI
;DX与SI内容相加,结果放DX中
ADDBYTEPTRALPHA[DI],30H;存储器+立即数
ADDAX,[BX+2000H];BX+2000H单元及BX+2001H单元内容与AX内容相加,结果放AX中
2、带进位位的加法指令:
ADCdest,src
功能:
目的操作数与源操作数及进位位CF内容相加,结果放目的地址。
例:
ADCCX,300
;CX中的内容与300以及CF的值相加,结果放CX中
ADCAL,BL
;AL与BL以及CF值相加,结果放BX
ADCBYTEPTRMEM,6;存储器+立即数+CF
ADC[BX+DI],AX;BX+DI和BX+DI+1两单元内容与AX内容及CF值相加,结果仍放BX+DI单元和BX+DI+1单元。
ADC指令为多字节加法运算提供了方便,如有两个4字节的无符号数相加,两个数分别放在2000H和4000H开始的存储单元中,低字节放在低地址单元,高字节放在高地址单元,和放在2000H开始的内存单元,可执行如下程序段:
CLC
;清进位位
MOVSI,2000H
;取第一个数的首地址
MOVAX,[SI]
;将第一个数的低16位取到AX
MOVDI,4000H
;取第二个数的首地址
ADDAX,[DI]
;第一个数和第二个数的低16位相加
MOV[SI],AX
;将和送2000H和2001H两单元
MOVAX,[SI+2]
;将第一个数的高16位送A中
ADCAX,[DI+2]
;两个数的高16位连同进位位相加
MOV[SI+2],AX
;高16位的和送2002H和2003H两单元
3、增量指令:
INCdest
功能:
将操作数的内容加1,再送回原地址。
该指令只有一个操作数,一般用在循环程序中修改指针和循环次数,且该指令执行结果不影响标志位CF。
例:
INCDL;DL中内容加1。
INCSI;SI中内容加1。
INCBYTEPTR[BX+DI+50];将BX+DI+50所指单元内容加1。
INCWORDPTR[DI];将存储器内容加1。
二、减法指令
1、不带借位的减法指令:
SUBdest,src
功能:
目的操作数减去源操作数,差放目的地址。
例:
SUBAL,37;将AL中内容减去37中内容,结果放AL。
SUB[BP+2],CL
;将SS段的BP+2所指单元内容减去CL中内容,结果仍放BP+2所指堆栈单元中。
SUBBX,0DH
;将BX中内容减去0DH,结果仍放BX
SUBWORDPTRALPHA[BX][DI],512H;存储器减立即数
2、带借位的减法指令:
SBBdest,src
功能:
目的操作数减去源操作数,再减去CF的值,结果放目的地址。
例:
SBBBX,100
;BX的内容减去100及CF的值,结果放BX
SBBCX,DX
;CX的内容减去DX的内容
SBBWORDPTR[DI],1000H
;DI和DI+1两单元内容减去1000H及CF的值,结果仍在DI和DI+1所指两单元。
与带进位的加法指令类似,SBB主要用于多字节减法运算中。
3、减量指令:
DECdest
功能:
将操作数的值减1,结果仍放原地址。
例如:
DECAL
;AL的内容减1;
DECBYTEPTR[BX][DI]
;将BX+DI所指单元内容减1。
4、取补指令:
NEGdest
功能:
将操作数取补码,结果仍放原地址。
因为对一个数取补码相当于用0减去此操作数,所以NEG指令执行的也是减法操作。
例如:
NEGAL
;将AL中的数取补码,送回AL。
NEGCX
;将CX的数码取补码,送回CX。
5、比较指令:
CMPdest,src
功能:
执行目的操作数减去源操作数,但不送回结果,只是使结果影响标志位,其执行结果如表4-2所示。
例:
CMPAL,0AH
;将AL内容与0AH相比较,结果影响标志位。
CMPCX,DI
;将CX与DI的内容相比较。
CMPWORDPTRALPHAGAMMA,100H;存储器与立即数比较
三、乘法指令
1、无符号乘法指令:
MULsrc
功能:
实现源操作数与累加器中的内容这两个无符号数的乘法,结果送累加器和DX。
2、带符号数乘法指令:
IMULsrc
功能:
同上,只是源操作数和累加器中的数均为带符号数。
以上两条指令的目的操作数是隐含规定的,为AL或AX,
例:
MULBX
;AX内容与BX内容相乘,结果在AX
MULBYTEPTR[1200H];AL与内存1200单元内容相乘,结果放AX。
IMUL[1080H]
;AX内容与1080H和1081H存储单元内容相乘,结果放DX及AX。
IMULWORDPRT[1200H];AX与内存1200H和1201H单元内容相乘,结果放DX和AX。
四、除法指令:
1、无符号除法指令:
DIVsrc
功能:
实现累加器(及扩展部分)除以源操作数的无符号除法。
2、带符号除法指令:
IDIVsrc
功能:
同上,只是源操作数和目的操作数均为带符号数。
除法运算中,若除数是8位,则要求被除数是16位,即在AX中,其结果商放在AL中,余数放在AH中,若除数是16位,则要求被除数是32位,即在DX,AX中,其结果商在AX中,余数放在DX中。
若被除数不满足要求,则要用以下两条指令进行扩展。
3、字节转换指令:
CBW
功能:
将AL中的符号位扩展到整个AH中,形成双字节的被除数。
4、字转换成双字指令:
CWD
功能:
将AX中的符号位扩展到整个DX中,形成四字节的被除数。
例:
DIVWORDPTR[1000H];
IDIVBL
例:
若要用AL中的带符号数除以80H单元的内容(带符号数),应执行以下操作:
CBW
;将AL中的带符号位扩展到AX中。
IDIV[80H]
;AX中内容除以80H单元内容,商在AL中,除数在AH中。
§4.4逻辑操作类指令
逻辑运算是计算机的另一种基本运算,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8088 指令系统