第三章_8086指令系统

第三章_8086指令系统
第三章_8086指令系统

第三章 8086指令系统

课时分配: 10学时

教学要求:

1、掌握8086的寻址方式;

2、了解8086的指令编码格式和指令系统概况;

3、掌握每一个指令的功能、汇编格式及用法;

教学内容:

1、寻址方式

2、指令系统

重点及难点:

掌握8086CPU的寻址方式、指令系统中指令的分类及其常用指令的格式和功能;

根据需要能够灵活运用指令;

§1寻址方式

一、概述

1、指令与指令系统

指令:控制计算机完成指定操作的命令;

指令系统:其所有指令的集合,就称为该计算机的指令系统;

8086的指令系统包括92种基本指令,按照所实现的功能,可分为6大类:数据传送指令;算术运算指令;逻辑运算和移位指令;串操作;控制转移指令;处理器控制指令。

2、指令格式

操作码 [操作数],[操作数]

操作码:也称为指令码,指计算机所要执行的操作,来实现的具体功能,用助记符来表示。

操作数:指在指令执行操作的过程中所需要的操作对象。可以有0个、1个或2个。

3、操作数分类

1)立即数操作数:也就是常数,在程序执行过程中,不会发生变化。8位或16位。只能用作元

操作数,不能用于目的操作数。

举例:

2)寄存器操作数:存放在通用寄存器中或段寄存器中。既可作源操作数,也可用于目的操作数,

但CS除外。可以是8位,也可以是16位

举例:

3)存储器操作数:可以是字节、字,也可以是双字。既可作源操作数,也可用于目的操作数。

但不允许源操作和目的操作数同时为存储器操作数。

MOV AH,[3120]

MOV AX,[3120]

LDS SI,[BX];地址传送指令;将把BX所指的32位地址指针的段地址部分送入DS,偏移量部分送入SI;

4、存储器操作数的地址

能够唯一标示一个存储器单元的是物理地址,由段地址和偏移地址组成。要寻找一个存储器操作数,首先要确定所在段的段地址。如果指令中没有指明所涉及到段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。

操作数的偏移地址:也称为有效地址,可以通过不同的寻址方式由指令给出。

5、指令的执行时间

了解指令的执行时间,在有时是非常重要的。例如用软件产生定时或延时时,需要估算出一段时间的运行时间。由于8086系统的指令种类很多,详细讨论比较繁琐也没不要,这里只作一般讨论。

一条指令的执行时间包括:取指令、取操作数、执行指令、传送结果。单位用时钟周期数表示。

不同指令的执行时间有较大的差别,书上列出了部分常用指令的执行时间及访问存储器的次数,如P96中表3-4所示。

存取操作数的时间与采用的寻址方式有关,寄存器操作数占用的时间最短,而存储器操作数占用的时间长一些,因为还需要考虑计算偏移地址所花费的时间。

二、寻址方式

寻址方式:主要是指获得操作数所在地址,也就是操作数的偏移地址(有效地值)。一般是指源操作数的地址。

在8086系统中,一般将寻址方式分为两种不同的类型,一类是寻找操作数的地址,另一类是寻找要执行的下一条指令的地址,即程序的地址。主要在程序转移或过程调用时用来寻找目的地址或入口地址。这将在调用指令CALL和程序转移指令JMP中详细介绍。

本章节主要讨论针对操作数地址的寻址方式。

共有7种寻址方式:

1、立即寻址

源操作数是一个立即数,即直接包含在指令中。它紧跟在指令的操作码之后,与操作码一起放在代码段区域中。如图所示。

例如:MOV AL,80H;

MOV AX,3000H;用示意图来说明

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低字节在前,高字节在后。

立即数寻址主要用来给寄存器或存储器赋初值,因为操作数可以从指令中直接取得,不需要总线周期,所以它的特点是速度快。

只适用于源操作数,不能用于目的操作数;

当源操作数是立即寻址时,目的操作数不能是段寄存器。MOV DS,20H

2、直接寻址

操作数的有效地址直接包含在指令中,其16位的

偏移地址与操作码—起存放在代码段区域,低字节在

前,高字节在后。

例如:MOV AX,DS:[2000H];

用示意图来说明

默认的段地址是DS,如果要对其他段寄存器所指

定的存储区进行直接寻址,则在本指令前,必须用前

缀指令指出段寄存器名。

MOV AX,[2000H] ;数据段

MOV BX,ES:[3000H];操作数在附加段,其物理地址=(ES)×16+3000H

适用于源操作数和目的操作数,但源操作数和目的操作数不能同时为直接寻址(存储单元)。注意:直接寻址与立即寻址的区别。规定:偏移地址必须用“[ ]”括起来。

3、寄存器寻址

其指令的操作数为CPU内部的寄存器,寄存器可以是16位,也可以是8位。可以是通用寄存器,专用寄存器、段寄存器。如AX、BX、CX、DX、SI,也可以是8位,如AH、BH、CH、DH、AL、BL、CL、DL等。

例如:MOV DI,AX;把AX寄存器中的内容传送到DI寄存器中。

MOV AL,BH

采用寄存器寻址时,操作码在段寄存器中,操作数在CPU内部的寄存器中,指令在执行时,直接从内部寄存器中取,因此执行速度快。

4、寄存器间接寻址

指令中指定的寄存器的内容不是操作数本身,而是操作数的偏移地址;换句话说,操作数的有效地址EA在寄存器中保存。

但只允许用到SI、DI(变址寄存器)、BP(基址指针寄存器)、BX(基址寄存器) 共4个寄存器。可以分成两种情况:

●以SI、DI、BX间接寻址,默认的段是DS,则操作数的物理地址为数据段寄存器(DS)×16加

上SI、DI、BX中的16位偏移量。

例如: MOV AX, [SI] 操作数地址是:(DS)×16+(SI)

用示意图来说明例子

●以寄存器BP间接寻址,默认的段是SS,即堆栈段寄存器(SS)×16与BP的内容相加作为操作

数的物理地址。

例如:MOV AX,[BP] 操作数地址是:(SS)×16+(BP)

在指令中可以使用段前缀命令来改变默认的段地址,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。

例如: MOV AX,DS:[BP] 操作数地址是:(DS)×16+(BP)

5.寄存器相对寻址

操作数在存储单元中,其偏移地址是一个8或16位的偏移量与一个基址寄存器或变址寄存器的内容之和。

+8位偏移量16位偏移量

(BX)

(BP)

(SI)

(DI)

EA=

例:MOV AX,[BX+1024H]

操作数地址是:(DS)×16+(BX)+1024H

同样:当以SI、DI、BX寻址时,默认的段是DS;以BP寻址时,默认的段是SS。也可以用段前缀来指定其他的段寄存器,如:

MOV AX,DS:[BP+1024H]

6.基址―变址寻址

操作数在存储单元中,有效地址一个基址寄存器和一个变址寄存器之和,可表示为:

基址寄存器――BX (数据段)、BP(堆栈段);

变址寄存器――SI、DI

例如:MOV AX,[BX][SI] 或 MOV AX,[BX+SI]

段寄存器则根据所使用的基址寄存器而定:

?若用BX作为基地址,则操作数在数据段区域;

?若用BP作为基地址,则操作数在堆栈段区域

在指令中可以用段前缀来指定其他的段寄存器,如:

MOV AX,DS:[BP][SI]

注意:不要将两个基址寄存器或两个变址寄存器组合在一起寻址,也不可以出现其他的寄存器。

7、相对基址―变址寻址

操作数在存储单元中,有效地址是一个8位或16位的偏移量、一个基址寄存器和一个变址寄存器三部分之和,可表示为:

MOV AX,[BX][SI+1000H]

8、隐含寻址

在有的指令的操作码中,不仅包含操作码的性质,还隐含了部分操作数的地址,这种将一个操作数隐含在指令码中的寻址方式称为隐含寻址。如:

MUL BL;BL是保存乘数,被乘数隐含在AL寄存器中,乘积隐含在AX寄存器中。

MUL BX;

练习:

1.假定DS=2000H,ES=2100H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据变量VAL的偏移地址为0050H,请指出下列指令源操作数是什么寻址方式?其物理地址是多少?

(1)MOV AX,0ABH (2)MOV AX,[100H]

(3)MOV BX,[SI] (4)MOV CL,[BX+SI+200H]

(5)MOV AL,VAL[BX] (6)MOV DI,[BP][SI]

2、判断下列指令是否有错,并说明原因 ( 5 对)

(1) MOV [DI],[SI] (2) MOV CS,AX

(3) MOV 128,CL (4) MOV AX,[SI][DI]

(5) MOV BL,[SI+2] (6) MOV BL,SI+2

(7) MOV [BX+CX],2130H (8) MOV DS,1000H

§2 8086指令系统

6类指令,共92个。数据传送指令;算术运算指令;逻辑运算与移位指令;串操作指令;控制转移指令;处理机控制指令。

简单介绍一下用到的符号。

1、数据传送指令

数据传送指令是最简单、最常用的一类指令,用来实现CPU的内部寄存器之间、CPU与存储器之间、CPU和I/O端口之间的数据传送。数据传送指令中的绝大多数都不会对状态寄存器FLAGS 产生影响。按功能可分为4类传送指令:

●通用传送指令;

●输入输出指令;

●地址传送指令;

●标志传送指令;

1.1、通用传送指令

包括:一般传送指令MOV;堆栈指令PUSH、POP;数据交换指令:XCHG;查表转换指令:XLAT;字位扩展指令:CBW、CWD

1.1.1、MOV指令:

格式: MOV dest,src ;dest←src

功能:将源操作数src复制到目的操作数dest中,操作结果是:目的操作数的内容等于源操作数的内容,源操作数src的内容不变。

对标志位的影响:无

目的操作数可以是:段寄存器、内存单元和内部寄存器;

源操作数可以是:段寄存器、存储单元、内部寄存器和立即数;

(1)指令特点:

①指令中的操作数可以是8位,也可以是16位,操作数的数据字长与指令中所涉及到寄存

器有关;

②可以使用各种寻址方式;

(2)指令实现的操作

MOV指令可以实现以下各种传送

①寄存器与寄存器,寄存器与段寄存器之间的传送

MOV BX,SI

MOV DS,AX MOV AX,CS

②寄存器与存储器之间的传送

若传送的是字操作数,那么将对连续两个存储单元进行存取,且寄存器的高8位对应存储器的高地址单元,寄存器的低8位对应存储器的低地址单元。

MOV [1000H],AX

MOV AX,[1020H]

MOV AX,[BX+SI]

③立即数到寄存器,立即数到存储单元

MOV [1000H],1024H

MOV AX,1020H

MOV [BX],1024H

④存储器与段寄存器之间的传送

MOV DX,[1020H]

MOV [BX],ES

(3)指令对操作数的要求

●MOV指令中两个操作数字长必须相同,可同为字节或字操作数;

●两个操作数不能同时为存储器操作数或段寄存器;

MOV seg ,seg ;错误

MOV mem ,mem ;错误

要想实现上述功能,需要两条MOV指令。

●立即数不能传送到段寄存器中。

MOV seg ,DATA ;错误

同样,要想实现上述功能,也需要两条MOV指令。

●一般情况下,段寄存器CS和指令指针寄存器IP不能作目的操作数,只能为源操作数;虽然许多指令的执行都对状态寄存器FLAGS的标志位产生影响,但通常情况下,FLAGS整体不作为操作数。

例: MOV AX,BL ;类型不匹配

MOV DS,1000H ;不允许立即数直接送给段寄存器

MOV [BX] ,[SI] ;不允许在两个存储单元之间直接传送

MOV ES,CS ;不允许段寄存器之间传送

MOV CS,AX ;CS不能作为目的操作数

让学生自己看书上的【例3-12】,是否能看明白,简单讲述一下。

1.1.2 XCHG(Exchange):交换指令

格式:XCHG OPRD1 , OPRD2 ;交换OPRD1与OPRD2的内容

操作结果,使得源操作数和目的操作数的内容进行了交换。

如:XCHG AL,BL

XCHG BX,CX

XCHG AX,BUFFER (符号地址)

注意事项:

①源操作数和目的操作数可以是寄存器和存储器,但不能同时为存储器;

②段寄存器和立即数不能作为操作数来使用;

③源操作数和目的操作数的字长必须一致;

例:XCHG BX ,[BP+SI]

设指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4254H,OPR2

的物理地址=2F000+0200+0046=2F246。

则指令执行后:(BX)=4254H,(2F246H)=6F30H。

1.1.3 查表转换指令

格式:XLAT ;AL=((BX)+(AL)) Array功能:完成一个字节的查表转换。

要求:①寄存器AL的内容作为一个256字节的表的下标;

②表的基地址在BX中;

③转换后的结果存放在AL中;

例:MOV BX,OFFSET TABLE

MOV AL,9

XLAT ;查表

执行结果为:(AL)=AAH

说明:

要查找元素的序号放在AL中,所以表格的最大长度不能大于256;

1.1.4堆栈操作指令

1)堆栈:是内存中一个特定的区域,用来存放寄存器或存储器中暂时不用又必须保存的数据。

其在内存中所处的段被称为堆栈段,段地址存放在SS段寄存器中。可以将堆栈看作一个小存储

器,但不能任意存取,必须遵循以下原则:

①每次存取必须是一个字,不能进行字节存取,而且只能是寄存器或存储器操作数,不能

是立即数;

②堆栈段在内存的位置由SS决定,SP寄存器作为堆栈的指针,SP内容始终指向栈顶所在存储单元;

③对堆栈的操作按“先进后出”的原则进行,且堆栈只有一个出口、入口;

④向堆栈中存放数据时,堆栈指针SP变小;从堆栈中取数据时,堆栈指针SP变大;

见书上109页图3-9 堆栈示意图

2)堆栈操作命令:PUSH、POP

PUSH操作使栈顶地址从高地址向低地址方向移动,而POP操作则刚好相反;

●进栈指令格式:PUSH OPRD ;

操作过程: OPRD的高字节→[(SP)-1];

OPRD的低字节→[(SP)-2];

(SP)-2→(SP)

源操作数可以是CPU内部的16位通用寄存器、段寄存器(CS除外)和存储单元(所有寻址方式),入栈操作对象必须是16位数

功能:将数据压入堆栈;

例如:PUSH BX

执行过程为:SP=SP-1,[SP]=BH;SP=SP-1,[SP]=BL,如图2-8所示

●出栈指令格式: POP OPRD ;

操作过程: [SP] →OPRD的低字节;

[(SP)+1] →OPRD的高字节;

(SP)+2→(SP)

功能:将数据弹出堆栈

对指令执行的要求同入栈指令。

例如:POP AX

POP [BX]

POP DS

3)注意事项:

①堆栈操作只能作字操作;

②操作数不能是立即数;

③ CS寄存器的值可以进栈,但不可以从堆栈中弹出一个字到CS段寄存器中;

④堆栈的内容是按先进后出的次序进行传送的;

在程序中,两个指令总是成对出现,通常在子程序调用和中断响应时,用来保护段点地址。

看书上109页【例3-13】,问学生执行结束后,DX与AX寄存器的内容?

1.1.5字位扩展指令:CBW、CWD

主要用于用于乘法和除法运算,当需要将一个字节的数扩展为字,或将一个字的数扩展为双字。

扩展原则:

A.对于无符号数来说,AH和DX的扩展是将AH和DX清零;

B.对于有符号数来说,AH的扩展,把AL的符号位扩展到AH中;同样,将把AX的符号位扩

展到DX中;

例如:有符号数24H扩展为一个字时,结果为0024H;

有符号数8200H扩展为一个字时,结果为FFFF8200H

1)字节扩展 CBW

隐含的操作数为AL和AH,执行后,结果存放到AX中;

例:MOV AL,22H

CBW ;(AX)=0022H

2)字扩展 CWD

隐含的操作数为Ax和DH,执行后,结果存放到DX:AX中;

例:MOV AX,8022H

CWD ;(DX)=FFFFH (AX) =8022H

1.2输入输出指令

用来向外部设备端口进行读写的指令,有两个:IN 、OUT 。

输入指令IN用于从I/O端口读取数据到AL或AX中,输出指令OUT 用于把AL或AX中的内容写到I/O端口上。

在输入输出指令中,有两种寻址方式:

1)直接寻址方式:端口地址为8位,端口地址为0~FFH,共256个端口。

2)寄存器间接寻址方式:端口地址为16位,端口地址为0~FFFFH,共64K个端口,端口地

址用寄存器DX来指定。

1、输入指令 IN

IN acc,port 或 IN acc,DX

功能:从I/O端口读取数据到AL或AX中。

例: IN AL,32H

IN AX,30H

MOV DX,1230H

IN AL,DX

IN AX,DX

2、输出指令 OUT

OUT port, acc 或 OUT DX, acc

功能:把AL或AX中的内容输出到指定端口。

例: OUT 32H,AL

OUT 32H,AX

MOV DX,1230H

OUT DX,AL

OUT DX,AX

1.3 地址传送指令:LEA、LDS、LES

1、取偏移地址 LEA 指令

格式: LEA reg16,mem

功能:把源操作数mem的16位偏移地址送到指定的寄存器中。

要求:①源操作数必须是一个存储单元;

②目的操作数必须是一个16位的通用寄存器。由于寄存器常用来作为地址指针,因此最好选用四个间址寄存器。

例:LEA BX,BUFR;把变量BUFR的地址偏移地址送到BX中;

P115页【例3-19】,两条指令的执行结果有何不同?

2、LDS

格式: LDS reg16,mem32

功能:完成一个地址指针的传送。地址指针有4个字节,其中,前2个

字节作为偏移量送入一个16位基址寄存器或变址寄存器,后2个字节作为段地址送入DS中。要求:源操作数是一个存储单元,目的操作数是基址寄存器或变址寄存器(BX,BP,SI,DI)。例如:LDS SI,[BX] ;

将把BX所指的32位地址指针的段地址部分送入DS,偏移量部分送入SI;

3、LES

与LDS功能类似,不同的是,两个高地址单元中给出的段地址是送向ES;

1.4 标志寄存器传送, LAHF、SAHF 、PUSHF 、POPF

1、LAHF:读取标志指令

将标志寄存器中的SF(D7)、ZF(D6)、AF(D4)、PF(D2)和CF(D0)(即低8位)传送至AH寄存器的指定位,空位没有定义,对标志位没有影响。

2、SAHF :设置标志指令

将寄存器AH的指定位,送至标志寄存器的SF、ZF、AF、PF和CF位(即低8位)。根据AH的内容,影响上述标志位,对OF、DF和IF无影响。

3、PUSHF:标志寄存器进栈

将标志寄存器压入堆栈顶部,同时修改堆栈指针,不影响标志位。

FLAGS高字节→[(SP)-1];

FLAGS低字节→[(SP)-2];

(SP)-2→(SP)

4、POPF:标志寄存器出栈

堆栈顶部的一个字,传送到标志寄存器,同时修改堆栈指针,影响标志位。

[SP] →FLAGS低字节;

[(SP)+1] →FLAGS高字节;

(SP)+2→(SP)

2、算术运算指令

算术运算指令中涉及到两种类型的数据:无符号数和有符号数。

提出问题:能否用一套算术运算指令,既能实现无符号数的运算,又能实现有符号数的运算?

答案是,加减运算可以采用同一套运算指令;对乘除运算来说,则不行;原因是,在加减运算中,当有符号数采用补码时,运算方法同无符号数的运算过程相同;对于乘除运算,有符号数和无符号数的运算过程完全不一致,不能采用统一的算法来实现。

但对于加减运算来说,采用同一套运算指令,必须满足两个条件:

1)参加运算的数值类型必须一致,即同为有符号数或同为无符号数;

2)要用不同的方法来判断有符号数或无符号数的运算结果是否有溢出;

举例说明:

略……

结论:

当无符号数运算产生溢出时,CF=1;

当有符号数运算产生溢出时,OF=1;

运算结果为零,则ZF=1;

运算结果为负数,则SF=1;

运算结果的低8位中1的个数为偶数,则PF=1;

主要指令有:二进制的加、减、乘、除运算,4类十进制调整指令;

2.1加法指令:ADD、ADC、INC

加法指令 ADD

格式: ADD OPRD1,OPRD2

功能: OPRD1←OPRD1+OPRD2

完成两个操作数相加,结果送至目的操作数OPRD1;

源操作数和目的操作数可以是8位或16位的寄存器和存储器操作数,但不能是段寄存器,并且源操作数也可以是立即数;

可以是无符号数,也可以是有符号数;

但源操作数和目的操作数不能同时为存储单元;

举例:

ADD AL,30 ;累加器与立即数相加

ADD BX,[3000H] ;通用寄存器与存储单元内容相加

ADD DI,CX ;通用寄存器之间

ADD DX,DATA[BX+SI] ;通用寄存器与存储单元内容相加

这些指令对标志位CF、DF、PF、SF、ZF和AF有影响。

P114页【例3-20】,计算得到各状态标志?(问学生)

●带进位的加法指令 ADC

格式:ADC OPRD1,OPRD2;带进位的加法

功能:OPRD1←OPRD1+OPRD2 +CF

这条指令与上—条指令类似,只是在两个操作数相加时,要把进位标志CF的现行值加上去,结果送至目的操作数。

ADC指令主要用于多字节运算中,这条指令对标志位的影响与ADD相同。见P115【例3-21】例:若有两个四字节的数,已分别放在自FIRST和SECOND开始的存储区中,每个数占四个存储单元。存放时,最低字节在地址最低处,则可用以下程序段实现相加。

MOV AX,FIRST

ADD AX,SECOND ;进行字运算

MOV THIRD,AX

MOV AX,FIRST+2

ADC AX,SECOND+2

MOV THIRD+2,AX

●格式:INC OPRD ;

功能:OPRD←OPRD+1

完成对指定的操作数OPRD加1,然后返回此操作数;此指令主要用于在循环程序中修改地址指针和循环次数等。

操作数可以是寄存器或存储单元;可以是8位,也可以是16位;但不能是段寄存器和立即数。

这条指令执行的结果影响标志位AF、OF、PF、SF和ZF,而对进位标志CF没有影响。例:INC AL ;(AL)+1→(AL)

INC [BX] ;将BX所指存储单元的内容+1,结果送回该单元

2.2减法指令: SUB、SBB,DEC、NEG(求补指令)、CMP(比较指令)

●格式:SUB OPRD1,OPRD2 ;(OPRD1- 被减数,OPRD2- 减数)

功能:OPRD1←OPRD1-OPRD2

完成两个操作数相减,是用目标操作数减去源操作数,并将结果存放到目标操作数所在的地

址中。同样:

源操作数和目的操作数可以是8位或16位的寄存器和存储单元,但不能是段寄存器,并且源操作数也可以是立即数;

可以是无符号数,也可以是有符号数;

但源操作数和目的操作数不能同时为存储单元;

这些指令对标志位CF、DF、PF、SF、ZF和AF有影响。

例如: SUB CX,BX

SUB [BP],CL

●格式:SBB OPRD1,OPRD2 ;

功能:OPRD1←OPRD1-OPRD2-CF

这条指令与SUB类似,只是在两个操作数相减时,还要减去借位标志CF的现行值.本指令对标志位AF、CF、OF、PF、SF和ZF都有影响。

同ADC指令一样,本指令主要用于多字节的减法运算。

●格式:DEC OPRD;

功能:OPRD←OPRD-1-CF

对指令的操作数减1,然后送回此操作数,

在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF、OF、PF、SF和ZF.但对CF标志不影响(即保持此指令以前的值)。

例如:DEC [SI]

DEC CL

看书上116页【例3-23】,并讲解计算过程。

●格式:NEG OPRD 取补

功能:对操作数取补,即用零减去操作数,再把结果送回操作数。

例如: NEG AL

NEG MULRE

若AL=00111100,则取补后为11000100;即00000000-00111100=11000100

此指令影响标志AF、CF、OF、PF、SF和ZF;要注意以下两点:

1)当执行NEG指令后,一般情况下CF=1,只有当操作数为零时,才使CF=0;

2)当操作数的值为80H(-128)或为8000H(-32768),执行NEG指令后,结果不变,但OF=1,其他情况下,OF=0;

●格式:CMP OPRD1,OPRD2 ;

功能: OPRD1-OPRD2

比较指令完成两个操作数相减,但结果不送回目的操作数,只是根据执行结果反映各状态标志的变化,此指令影响标志AF、CF、OF、PF、SF和ZF。

例如: CMP AL,100

CMP DX,DI

CMP CX,COUHT[BP]

CMP COUNT[SI],AX

比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF标志即可判断两者是否相等。

?相等的比较:

①若两者相等,相减以后结果为零,ZF标志为1,否则为0。

②若两者不相等,则可利用其它标志位的状态来确定两者的大小。

?大小的比较:

①两个无符号数(如CMP AX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AX≥BX;若产生了借位(即CF=1),则AX<BX;

②两个有符号数的比较

◆当两个正数或两个负数相比较时,用SF来判断,当SF=0时,被减数大;SF=1,减数大;

◆当一个正数和一个负数相比较时,用SF和OF来判断;

A.当OF=0时,如果SF=0,则被减数小;SF=1,减数小;

B.当OF=1时,如果SF=0,则被减数大;SF=1,减数大;

P117页上的叙述,可以举例来说明,看书上118页【例3-24】

2.3.乘法指令(MUL和IMUL)

采用隐含寻址方式,隐含的目标操作数为AX(DX),而源操作数由指令给出。

●无符号乘法指令 MUL

格式: MUL OPRD

完成字节与字节相乘、字与字相乘,且默认的操作数放在AL或AX中,而源操作数由指令给出。

8位数相乘,结果为16位数,放在AX中;16位数相乘结果为32位数,高16位放在DX,低16位放在AX中。

源操作数可以是8位或16位的寄存器或存储器,且不能为立即数;

源操作数应满足无符号数的表示范围;

例如:

MUL BL

MUL BX

MUL WORD PTR [SI]

对标志位的影响,当乘积的高半部分不为零时,CF=OF=1;否则CF=OF=0,在这里代表的是AH或DX中包含乘积的有效数字,而不是有进位和是否溢出,其他标志无定义。

●带符号数乘法指令IMUL

格式:IMUL OPRD ;OPRD 为源操作数

这是一条带符号数的乘法指令,同MUL一样可以进行字节与字节、字和字的乘法运算。结果放在AX或DX,AX中。与MUL指令不同之处有:

1)要求两个必须为有符号数;

2)当乘积的高半部分是低半部分的符号位的扩展时,CF=OF=0;否则CF=OF=1;

3)源操作数应满足有符号数的表示范围;

看书上119页【例3-25】,说明执行结果的不同。

2.4、除法指令(DIV、IDIV)

采用隐含寻址方式,隐含的目标操作数为AX(DX),而源操作数由指令给出

除法指令要求:除数必须为被除数的一半,指令格式中给出的是除数,要根据除数的位数来决定被除数的位数。

当被除数为16位时,除数为8位,得到8位的商放在AL中,8位的余数放在AH中;

当被除数为32位时,除数为16位,得到商放在AX中,余数放在DX中;

●无符号数除法指令 DIV

格式:DIV OPRD

源操作数可以是8位或16位的寄存器或存储单元,但不能是立即数。

●带符号数除法IDIV

格式:IDIV OPRD

该指令执行过程同DIV指令,但IDIV指令认为操作数的最高位为符号位,除法运算的结果商的最高位也为符号位。

例如:AX=2000H,DX=200H,BX=1000H,

则 DIV BX执行后,AX=2002H ,DX=0000。

注意:

1)除法运算后,标志位是不确定的;

2)用IDIV指令后,一个双字除以字,则商的范围:-32768~32767;一个字除以字节,则商的

范围:-128~127;如果运算结果超出了上述范围,会作为除数为0的情况来处理,即产生0号中断,而不是使OF置1;

3)当被除数的长度不够除数长度的两倍时,必须对被除数进行扩展;

2.5、BCD码运算调整指令

调整指令均采用隐含寻址方式,隐含的操作数是AL或AH,一般不单独使用,而是与加、减、乘、除指令配合使用,实现BCD码的算术运算。

BCD码有两类:压缩的BCD码,就是1个字节表示2位BCD码;非压缩的BCD码,就是1个字节表示1位BCD码,只用低4位来表示,高4位为0;

BCD码运算采用的方法:利用对普通二进制数的运算指令算出结果,再用专门指令对结果进行调整。

2.5.1 加法调整指令:AAA(非压缩),DAA(压缩)

●DAA:对两个压缩BCD码相加后的和进行调整,调整前,运算结果必须保存到AL中。

调整方法:

①若(AL)中的低4位>9或AF=1,则(AL)+06H→(AL),并使AF=1;

②若(AL)中的高4位>9或CF=1,则(AL)+60H→(AL),并使CF=1;

DAA指令会影响标志位AF、CF、PF、SF、ZF,不影响OF;

●AAA:对两个非压缩BCD码相加后的和进行调整,调整前,运算结果必须保存到AL中。

与DAA的不同之处:调整后的结果,其低位在AL中,高位在AH中。调整方法:

①若(AL)中的低4位>9或AF=1,则(AL)+06H→(AL);(AH)+1→(AH),且AF=1;

②屏蔽AL的高4位,且AF→CF;

AAA指令会影响标志位AF和CF;

注:加法调整指令必须紧跟在加法指令后,且加法执行结果必须放在AL中。

2.5.2 减法调整指令:AAS(非压缩),DAS(压缩)

●DAS:对两个压缩BCD码相减后的和进行调整,调整前,运算结果必须保存到AL中。

调整方法:

①若(AL)中的低4位>9或AF=1,则(AL)-06H→(AL),并使AF=1;

②若(AL)中的高4位>9或CF=1,则(AL)-60H→(AL),并使CF=1;

DAS指令会影响标志位AF、CF、PF、SF、ZF,不影响OF;

●AAS:对两个非压缩BCD码相减后的和进行调整,调整前,运算结果必须保存到AL中。

与DAS的不同之处:调整后的结果,其低位在AL中,高位在AH中。调整方法:

①若(AL)中的低4位>9或AF=1,则(AL)-06H→(AL);(AH)-1→(AH),且AF=1;

②屏蔽AL的高4位,且AF→CF;

AAS指令会影响标志位AF和CF;

注:减法调整指令必须紧跟在减法指令后,且加法执行结果必须放在AL中。

2.5.3 乘法调整指令:AAM

●AAM:对两个非压缩BCD码相乘的结果进行调整,调整前,运算结果必须保存到AX中。

操作方法:把AL寄存器的内容除以0AH,商放到AH中,余数放到AL中。

说明:

①对BCD码进行乘法运算时,要求乘数和被乘数都必须是非压缩的BCD码,否则结果将无法调整;

② BCD码是作为无符号数来看待,所以相乘时用MUL指令,而不用IMUL指令;

③ AAM指令必须紧跟在乘法指令MUL之后;

④ AAM指令会影响标志位SF、ZF、PF;

2.5.4 除法调整指令:AAD

操作方法: (AH)×10+(AL)→(AL);0→(AH)

说明:

①对BCD码进行除法运算时,要求除数和被除数都用非组合的BCD码来表示;

② AAD指令是在除法指令DIV之前,对除数和被除数进行调整的;

③ AAD指令会影响标志位SF、ZF、PF;

3、逻辑运算和移位指令

3.1 逻辑运算指令

共有5条指令,AND、OR、NOT、XOR、TEST(测试),这些指令可对8位或16位的寄存器或存储单元的内容进行按位操作。

●AND dest,src

功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。

●OR dest,src

功能:对两个操作数进行按位的逻辑“或”运算,结果送回目的操作数。

●XOR dest,src

功能:对两个操作数进行按位的逻辑“异或”运算,结果送回目的操作数。

双操作数指令,既可以对8位数操作,也可对16位数操作,影响SF、ZF、PF,OF=0、CF=0,AF不确定;

例:MOV BX,0F56H

AND BL,BH ;BL=06H

OR BL,BH

XOR BL,BH

操作数:目的操作数:通用寄存器、存储器;

源操作数:通用寄存器、存储器、立即数;

注意:两操作数不能都是存储器操作数。

●NOT dest

功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容;既可以对8位数操作,也可对16位数操作;此指令对标志无影响。

例如:NOT AL

NOT BX

NOT WORD PTR[2000H];将2000H、2001H两单元的内容求反,再送回这两单元中

●TEST dest,src

功能:与AND指令执行结果类似,但指令执行后,目的操作数保持不变,只影响标志位。

第三章指令系统

第5章指令系统 一、判断题 (×)1.执行指令时,指令在内存中的地址存放在指令寄存器中。 (√)2.程序计数器PC用来指示从内存中取指令。 (√)3.同一系列的不同型号的计算机,保持软件向上兼容的特点。 (√)4.在计算机的指令系统中,真正必须的指令数是不多的,其余的指令都是为了提高机器速度和便于编程而引入的。 (×)5.RISC的主要目标是减少指令数,因此允许以增加每条指令的功能的办法来减少指令系统所包含的指令数。 二、选择题 1.在计算机的指令系统中采用不同的寻址方式的主要目的是 C 。 A.实现程序控制和快速查找存储器地址 B.可以直接访问主存和外存 C.缩短指令长度,扩大寻址空间,提高编程的灵活性 D.降低指令的译码难度 2.单操作数指令的操作数由 B 提供。 A.指定寄存器或由操作码指定存储单元 B.由地址码指定的存储单元;如果已标明该存储单元的内容为地址,则由该地址所指定的存储单元 C.由操作码直接指定数据 D.由操作码直接指定的存储单元 3.在多地址指令中,算术运算结果不会存储在 A 中。 A.累加器B.第一地址码所指定的存储空间 C.第二地址码所指定的存储空间D.第三地址码所指定的存储空间 4.把存储单元A的内容传送到存储单元B的指令执行后,存储单元A的内容为 B 。A.空白或零,视机器而定B.与存储单元B的内容相同 C.二进制补码D.存储单元A的内容与存储单元B的内容之差 三、填空题 1.指令操作码通常有两种编码格式:固定格式和可变格式。 2.在当前的计算机中,指令的执行方式有3种,就是顺序执行方式,重叠执行方式和流水线方式。 3.数据传送类指令实现的功能是传送数据,它往往是在主存储器和寄存器之间,或寄存器和寄存器之间传送数据。 4.所谓堆栈,是主存中专门用来存放数据的一个特定的区域,它具有先进后出的性质。 5.Intel 8086/8088的字符串操作指令用来处理存放在存储器中的一串字符或数据。6.内存地址寄存器用来指示从内存中取数据。 7.浮点运算指令对于用于科学计算的计算机是很必要的,可以提高机器的运算速度。四、名词解释 1.计算机指令系统:是指一台计算机上全部指令的集合,也称为计算机的指令集。 2.固定格式:操作码的长度是固定的,集中放在指令字的某一个字段中。 3.可变格式:操作码的长度可变,且分散地放在指令字的不同字段中。 4.寻址:就是寻找操作数的地址,最终目的是寻找所需的操作数。 五、简答题

(完整版)第三章指令系统

第三章指令系统习题参考答案(三) 1、80C51系列单片机的指令系统有何特点? 答:80c51的指令系统的特点有:(1)执行时间短。一个机器周期指令有64条,2个时间周期指令有45条,而4个机器周期指令仅有2条(即乘法和除法指令);(2)指令编码字节少。单字节的指令有49条,双字节的指令有45条,三字节的指令仅有17条;(3)位操作指令丰富。这是80c51单片机面向控制特点的重要保证。 2、80C51单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器 空间如何? 答:(1)寄存器寻址。 对应的寄存器有: ·工作寄存器R0~R7 ·累加器A ·寄存器B ·数据指针DPTR (2)直接寻址。 对应的存储空间有: ·片内RAM低128字节(以地址形式表示) ·SFR(以地址形式或SFR符号形式表示,但符号将转换为相应的SFR 地址) (3)寄存器间接寻址。 对应的空间有: ·片内RAM(采用@R0,@R1或SP); ·片外RAM(采用@R0,@R1或@DPTR) (4)变址寻址。 对应的空间有: ·ROM空间(采用@A+DPTR,@A+PC) (5)相对寻址。 ·ROM空间(采用JC rel) (6)位寻址。 ·片内RAM的20H~2FH单元的128可寻址位 ·SFR的可寻址位 3、访问特殊功寄存器SFR可以采用哪些寻址方式? 答:直接寻址、位寻址 4、访问内部RAM单元可以采用哪些寻址方式? 答:寄存器寻址、直接寻址、寄存器间接寻址 5、访问外部RAM单元可以采用哪些寻址方式? 答:寄存器间接寻址 6、访问外部程序存储器可以采用哪些寻址方式? 答:立即寻址、变址寻址、相对寻址 7、为什么说布尔处理功能是80C51单片机的重要特点? 答:布尔处理功能是MCS-51系列单片机的一个重要特征,在物理结构

第三章 80868088的指令系统

3.1 指令的基本格式   一、指令构成 微计算机的指令系统通常由几十种或百余种指令组成(可见表2-1)。每种指令又由两个字段(Field)构成: l.操作码(OP-Code)字段 该字段指示计算机所要执行的操作类型,由一组二进制代码表示,在汇编语言中又用助记将(Mnemonic)代表。8086执行指令时,首先将操作码从指令队列取入执行部件EU中的控制单元,经指令译码器识别后,产生执行本指令操作所需的时序性控制信号,控制计算机完成规定的操作。 2.操作数(Oprand)字段 该字段则是指出指令执行的操作所需的操作数。在操作数字段中,可以是操作数本身,或是操作数地址或是操作数地址的计算方法。微计算机中此字段通常可有一个或两个,称前者为单操作数指令,称后者为双操作数指令。而双操作数又分别称为源操作数src (source)和目的操作数dst(destination)。在指令执行之前,src和dst均为参加运算处理的两个操作数,指令执行之后,在dst中则存放运算处理的结果。 指令的基本格式如下:   二、8086   8086的指令长度可在1~6字节的范围,如图3-1所示。其中B l和B0为基本字节,B3~B6将根据不同指令作相应的安排。   (1)B1字节各字段定义如下: OP--指令操作码。 D--表示方向。D=1寄存器为目的,D=0寄存器为源。 W--表示字节或字处理方式。W=0为字节指令,W=1为字指令。

(2)B2字节各字段定义如下: MOD--给出指令的寻址方式。8086的一条指令中,最多可使用两个操作数,它们不能同时位于存储器中,最多只能有一个是存储器操作数。当MOD=11时为存储器方式,即有一个操作数位于存储器中;MOD=00,没有位移量; MOD01,只有低8位位移量,需将符号扩展8位,形成16位; MOD=10有16位位移量。当MOD=1l时,为寄存器方式,两个操作数均为寄存器。 REG--表示指令中只有一个操作数,这个操作数为寄存器,可见表3-1,表中左部示出寄存器对应的编码。 R/M--R/M受MOD制约。当 MOD=11(即寄存器方式时),由此字段给出指令中第二个操作数所在的寄存器编码;当MOD≠11时,此字段用来指出应如何计算指令中使用的存储器操作数的有效地址。MOD和R /M字段表示的有效地址 EA计算方法如表3-1所示,共2 4种。   (3) B3~B6字节这四个字节一般是给出存储器操作数地址的位移量(即偏移量)和/或立即操作数。位移量可为8位,也可为16位,这由MOD来决定。8086规定16位的字位移量的低位字节放于低地址单元,高位字节放于高地址单元。 若指令中只有8位位移量, 8086在计算有效地址时,自动用符号将其扩展成一个16位的双字节数,以保证有效地址的计算不产生错误,实现正确的寻址。指令中的立即操作数位于位移量的后面。若B3,B4有位移量,立即操作数就位于B5,B6。若指令中无位移量,立即操作数就位于B3,B4字节。总之,指令中缺少的项将由后面存在的项向前顶替,以减少指令长度。 3.2 8086的寻址方式   8086的操作数可隐含在操作码中,也可以是操作数字段中的操作数本身,还可以是存放操作数的地址,如寄存器,I/0端口及存储器。对存储器,给出的或是存储器地址,或是产生存储器地址的信息。从表3

第3章答案指令系统1-40..

第3章指令系统 1,简述下列基本概念:指令,指令系统,机器语言,汇编语言,高级语言。1、指令:CPU根据人的意图来执行某种操作的命令 指令系统:一台计算机所能执行的全部指令集合 机器语言:用二进制编码表示,计算机能直接识别和执行的语言 汇编语言:用助记符、符号和数字来表示指令的程序语言 高级语言:独立于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言 2,什么是计算机的指令和指令系统? 2、见第1题。 3,简述89C51汇编指令格式。 3、操作码[目的操作数] [,源操作数] 4,简述89C51寻址方式和所能涉及的寻址空间。 5,要访问特殊功能寄存器和片外数据寄存器,应采用哪些寻址方式? 5、SFR:直接寻址,位寻址,寄存器寻址;片外RAM:寄存器间接寻址 6,在89C51片内RAM中,已知(30H)=38H, (38H)=40H, (40H)=48H, (48H)=90H, 请分析下面各是什么指令,说明源操作数的寻址方式以及按顺序执行每条指令后的结果。 6、MOV A,40H ;直接寻址(40H)→A MOV R0,A ;寄存器寻址(A)→R0 MOV P1,#0F0H ;立即数寻址0F0→P1

MOV @R0,30H ;直接寻址(30H)→(R0) MOV DPTR,#3848H ;立即数寻址3848H→DPTR MOV 40H,38H ;直接寻址(38H)→40H MOV R0,30H ;直接寻址(30H)→R0 MOV P0,R0 ;寄存器寻址(R0 )→P0 MOV 18H,#30H ;立即数寻址30H→18H MOV A,@R0 ;寄存器间接寻址((R0)) →A MOV P2,P1 ;直接寻址(P1)→P2 最后结果:(R0)=38H,(A)=40H,(P0)=38H,(P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,(30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H 注意:→左边是内容,右边是单元 7,对89C51片内RAM的高128字节的地址空间寻址要注意什么 7、用直接寻址,位寻址,寄存器寻址 8,指出下列指令的本质区别。 8,MOV A,DATA ;直接寻址2字节1周期 MOV A,#DATA ;立即数寻址2字节1周期 MOV DATA1,DATA2 ;直接寻址3字节2周期 MOV 74H,#78H ;立即数寻址3字节2周期 如果想查某一指令的机器码,字节数或周期数可查阅书本后面的附录A 9,设R0内容为32H, A的内容为48H, 片内RAM的32H单元内容为80H, 40H单元内容为08H, 请指出在执行下列程序段后上述各单元内容的变化。 9、 MOV A,@R0 ;((R0))=80H→A MOV @R0,40H ;(40H)=08H→(R0) MOV 40H,A ;(A)=80→40H MOV R0,#35H ;35H→R0 最后结果:(R0)=35H (A)=80H,(32H)=08H,(40H)=80H 10,如何访问SFR,可使用哪些寻址方式? 10、用直接寻址,位寻址,寄存器寻址 11,如何访问片外RAM,可使用哪些寻址方式? 11、只能采用寄存器间接寻址(用MOVX指令) 12,如何访问片内RAM,可使用哪些寻址方式? 12、低128字节:直接寻址,位寻址,寄存器间接寻址,寄存器寻址(R0~R7) 高128字节:直接寻址,位寻址,寄存器寻址 13,如何访问片内外程序存储器,可使用哪些寻址方式? 13、采用变址寻址(用MOVC指令)

相关主题
相关文档
最新文档