第3章 寻址方式与指令系统_第1页
第3章 寻址方式与指令系统_第2页
第3章 寻址方式与指令系统_第3页
第3章 寻址方式与指令系统_第4页
第3章 寻址方式与指令系统_第5页
已阅读5页,还剩194页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理与接口技术1第二章

内容回顾2第二章重点之一

8086CPU内部结构3目的变址寄存器DestinationIndexSIDIBPSPAX

累加器AccumulatorBX基址寄存器BaseCX

计数寄存器CountDX

数据寄存器DataAHBHCHDHALBLCLDLIPPSWDSESSSCS数据段寄存器DataSegment附加段寄存器ExtraSegment堆栈段寄存器StackSegment代码段寄存器CodeSegment状态标志寄存器ProcessorStatusWord指令指针寄存器InstructionPointer变址寄存器段寄存器控制寄存器通用寄存器源变址寄存器SourceIndex基址指针寄存器BasePoint堆栈指针寄存器StackPoint指针寄存器数据寄存器第二章重点之二4第二章重点之三逻辑地址的组成——段基址:偏移地址物理地址的形成——段基址×16+偏移地址段基址00001503210偏移地址150地址加法器物理地址190存储器的分段管理5第二章重点之四堆栈的概念及工作过程6第三章8086的寻址方式和指令系统8086的寻址方式微机系统指令的机器码表示方法8086的指令系统内容提要7§3-18086的寻址方式概述

§3-18086的寻址方式——概述

计算机的指令包括:操作码

操作数

↓操作的性质操作的对象

↓存放在

寄存器、存储器、I/O端口地址、立即数(由寻址方式决定)寻址方式:指令中说明操作数所在地址的方法。指令分类:单操作数、双操作数、无操作数。(双操作数指令形式:操作码目的操作数,源操作数)8§3-18086的寻址方式——概述

各种寻址方式指令执行速度不同:

操作数在寄存器中指令执行速度快:在CPU内部立即执行;

立即数寻址指令执行速度较快:直接从指令队列中取数;

操作数在存储器中指令执行速度较慢:通过总线与CPU交换数据。CPU进行读/写存储器的操作:①把一个偏移量送到BIU,计算出20位物理地址;②执行总线周期存取操作数。9§3-18086的寻址方式——概述

8086指令的寻址方式类型:一、立即寻址方式二、寄存器寻址方式三、直接寻址方式四、寄存器间接寻址方式五、寄存器相对寻址方式六、基址变址寻址方式七、相对基址变址寻址方式八、其它10§3-18086的寻址方式——立即寻址方式

一、立即寻址方式(ImmediateAddressing)

1.含义:操作数是立即数(即8位或16位的常数),直接包含在指令中。2.特点:翻译成机器码时,立即数是指令的一部分,紧跟在操作码之后存放在代码段内。在取出指令的同时也就取出了操作数,立即有操作数可用,所以称之为立即寻址。如果立即数是l6位数:高字节→代码段的高地址单元,低字节→低地址单元;3.作用:常用于给寄存器赋初值。11§3-18086的寻址方式——立即寻址方式

例3.1:MOVAL,26H例3.2:MOVCX,2A50H

解:将立即数2A50H送到CX寄存器中。4.注意:①立即数可以送到寄存器、一个存储单元(8位)、两个连续的存储单元(16位)中去;②立即数只能作源操作数,不能作目的操作数;③以A~F打头的数字出现在指令中时,前面必须加数字0。以免与其它符号相混淆(如:MOVAX0FF00H)。MOVCX,2A50H12§3-18086的寻址方式——寄存器寻址方式

二、寄存器寻址方式

(RegisterAddressing)

1.含义:操作数包含在寄存器中,寄存器的名称由指令指定。2.特点:16位操作数:寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等。8位操作数:寄存器AH、AL、BH、BL、CH、CL、DH和DL。3.作用:寄存器之间传递数据。例3.3MOVDX,AX

解:(AX)送到CX寄存器中。(AX内容不变)(又例:MOVAL,AH)4.注意:源操作数的长度必须与目的操作数—致。13§3-18086的寻址方式——直接寻址方式三、直接寻址方式(DirectAddressing)

1.含义:

存储单元的有效地址EA(即:操作数的偏移地址)直接由指令给出。

2.特点:机器码中,有效地址存放在代码段中指令的操作码之后,而该地址单元中的数据总是存放在存储器中。须先求出操作数的物理地址,再从存储器中取得操作数。操作数的物理地址=16×DS+EA3.作用:

实现对存储单元的读/写操作。

接下来的几种寻址方式,用于在存储器中寻找操作数,即指令的操作数在存储器中,要通过寻址方式求出物理地址才能获得操作数。14§3-18086的寻址方式——直接寻址方式

例3.5MOVAX,[2000H]解:设DS=3000H,由指令得:EA=2000H(16位逻辑地址)物理地址=16×3000H+2000H=32000H(20位,20根地址线);设32000H地址单元的内容为1234H,即(32000H)=1234H则:AX=1234H指令执行过程如图所示。(注:如用AL替代AX,则AL=34H)15注意:为了代码的安全,汇编语言中一般不允许对存储器进行直接寻址访问,所以汇编语言中MOVAL,[2000H]语句要用MOVAL,DS:[2000H]来代替,否则汇编时会出现警告,并将原语句编译等价为MOVAL,2000H语句。4.段超越前缀例3.7MOVAX,ES:[500]5.符号地址

汇编语言中一般用符号地址代替直接数值地址,由编译器来计算操作数的有效直接地址,防止人工计算地址出错。例3.10AREA1DW0867HMOVAX,AREA116§3-18086的寻址方式——寄存器间接寻址方式四、寄存器间接寻址方式(RegisterIndirectAddressing)1.含义:操作数的有效地址放在寄存器中。2.特点:可以使用的寄存器有:基址寄存器BX、BP,变址寄存器SI、DI。如果使用BX、SI、DI寄存器,则默认操作数在数据段中,如果使用BP寄存器,则默认操作数在堆栈段中。操作数的物理地址=16×DS+BX/SI/DI或=16×SS+BP3.作用:将存储器单元的有效地址存放在寄存器中。

17§3-18086的寻址方式——寄存器间接寻址方式例3.11MOVBX,[SI]解:设:DS=1000H,SI=2000H,(12000H)=318BH则:物理地址=16×DS+SI=10000H+2000H=12000H指令执行后,BX=318BH,指令执行过程如图所示。此处书上有错,机器指令中应该只有2字节操作码8B1C18

4.注意:▲寄存器名称外必须加方括号,以区别寄存器寻址方式;▲可以使用段超越前缀来从默认段以外的段中取得数据;例MOVBX,ES:[SI]▲关于默认段:指定寄存器BX、SI或DI,默认操作数存放在数据段DS中;(DS:BX,SI,DI)

指定寄存器BP,默认操作数存放在数据段SS中;(SS:BP)

§3-18086的寻址方式——寄存器间接寻址方式19§3-18086的寻址方式——寄存器相对寻址方式五、寄存器相对寻址方式(RegisterRelativeAddressing)

1.含义:操作数的有效地址是基址或变址寄存器的内容与8位或16位位移量(Displacement)之和。即

[BX]/[BP]EA=+8位偏移量/16位偏移量[SI]/[DI]2.特点:使用:BX、BP、SI、DI。操作数的物理地址=16×DS+BX/SI/DI+COUNT或=16×SS+BP+COUNT

20§3-18086的寻址方式——寄存器相对寻址方式例3.12MOVBX,COUNT[SI];或:MOVBX,[COUNT+SI]解:设:DS=3000H,SI=2000H,位移量COUNT=4000H,(36000H)=318BH则:物理地址=16×DS+SI+COUNT=30000H+2000H+4000H=36000H指令执行后,BX=318BH40300021

3.注意:▲寄存器名称外必须加方括号,位移量可以在括号内,也可以在括号外;▲段超越前缀来从默认段以外的段中取得数据;

例MOVDH,ES:ARRAY[SI]▲关于默认段:

指定寄存器BX、SI或DI,默认操作数存放在数据段DS中;(DS:BX,SI,DI)

指定寄存器BP,默认操作数存放在数据段SS中;

(SS:BP)

§3-18086的寻址方式——寄存器相对寻址方式22§3-18086的寻址方式——基址变址寻址方式六、基址变址寻址方式(RegisterRelativeAddressing)1.含义:操作数的有效地址是一个基址寄存器(BX、BP)的内容与一个变址寄存器(SI、DI)的内容之和。2.特点:使用的寄存器:基址寄存器BX、BP,变址寄存器SI、DI。操作数的物理地址=16×DS+BX+SI/DI或=16×SS+BP+SI/DI3.注意:▲寄存器SI和DI、BP和BX不能同时出现在[]中。23§3-18086的寻址方式——基址变址寻址方式例3.13MOVAX,[BX]

[SI];或:MOVBX,[BX+SI]解:设:DS=3000H,SI=0500H,BX=1200H,(31700H)=0ABCDH则:物理地址=16×DS+SI+BX=30000H+0500H+1200H=31700H指令执行后,AX=0ABCDH24§3-18086的寻址方式——相对基址变址寻址方式七、相对基址变址寻址方式(RelativeBasedIndexedAddressing)

1.含义:操作数的有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容,再加上8位或16位位移量之和。即[BX][SI]EA=++位移量[BP][DI]2.特点:使用的寄存器:基址寄存器BX、BP,变址寄存器SI、DI。操作数的物理地址=16×DS+BX+SI/DI+8/16位位移量或=16×SS+BP+SI/DI+8/16位位移量3.注意:▲寄存器SI和DI、BP和BX不能同时出现在[]中。25§3-18086的寻址方式——相对基址变址寻址方式例3.14MOVAX,MASK[BX]

[SI];或:MOVBX,[MASK+BX+SI]解:设:DS=3000H,SI=0300H,BX=1500H,MASK=0200H,(21A00H)=26BFH则:物理地址=16×DS+SI+BX+MASK=20000H+0300H+1500H+0200H=21A00H指令执行后,AX=26BFH26§3-18086的寻址方式——寻址方式总结

存储器操作数寻址方式总结:

▲带方括号的地址表达式必须遵循下列规则:

1.立即数可以出现在方括号内,表示直接地址,但要加上DS:如DS:[2000H],否则会出现警告。

2.只有BX、BP、SI、DI这四个寄存器可以出现在[]内,它们可以单独出现,也可以相加,或与常数相加,但:BX和BP寄存器、SI和DI寄存器不允许出现在同一个[]内。

3.方括号表示相加,下面几种写法等价:6[BX][SI];[BX+6][SI];[BX+SI+6]

27§3-18086的寻址方式——寻址方式总结4.不同寄存器对应不同的隐含段基址:

SS:BP;DS:BX,SI,DI;物理地址=16×相应段基址+EAEA=BX/BP+SI/DI+DISP

(注:可以是单一寄存器、两个寄存器组合、和DISP组合;DISP也可以为0)▲可用段超越前缀修改段基址。28§3-18086的寻址方式——其它八、其它1.隐含寻址:指令中不指明操作数,但有隐含规定的寻址方式。如:指令DAA;对寄存器AL中的数据进行十进制数调整,结果仍保留在AL中。2.I/O端口寻址:8086有直接端口和间接端口两种寻址方式。

▲直接端口寻址方式:指令直接提供端口地址——8位立即数。可访问端口00~FFH,即256个端口。例如,INAL,63H;表示将瑞口63H中的内容送进AL寄存器

▲间接端口寻址方式:端口地址由寄存器DX提供,端口号为0000—FFFFH。29§3-18086的寻址方式——其它

例如,MOV DX,213H ;DX=口地址号213H INAL,DX ;AL←端口213H中的内容3.一条指令有多种寻址方式:

源操作数可以使用上述介绍的各种寻址方式。目的操作数可以使用除立即寻址方式以外的各种寻址方式。例3.17MOV[BX],AL解:设:BX=3600H,DS=1000H,AL=05H则:目的操作数的物理地址=16×DS+BX=13600H指令执行结果为(13600H)=05H。4.转移类指令寻址(程序寻址)30§3-2指令的机器码表示方法(不作要求)一、机器语言指令的编码目的和特点§3-2指令的机器码表示方法——目的和特点

汇编语言源程序:用汇编语言(即主要由指令系统组成的语言)编写的程序。编译程序执行源程序机器码运算结果指令通常由操作码和操作数两部分组成。▲8086指令系统采用变长指令,指令的长度可由1~6字节组成。31§3-2指令的机器码表示方法——指令代码的编制

二、机器语言指令代码的编制其中,第一个字节:▲高6位是操作码100010;▲W位说明传递数据的类型是字(W=l)还是字节(W=0);▲D位标明数据传送的方向:D=0,数据从寄存器传出;D=1,数据传至寄存器;1.编码格式说明(MOV指令为例):

32§3-2指令的机器码表示方法——指令代码的编制

第二个字节:▲REG字段:寄存器号,用3位编码寻址8种不同的寄存器,再根据第一字节中W位,选择8位或16位寄存器。如表3-l所示。(对段寄存器,REG字段占2位)

例如:REG=010,W=1时表示寻址DX寄存器;REG=010,W=0时寻址DL寄存器。33§3-2指令的机器码表示方法——指令代码的编制

▲MOD字段和R/M字段:MOV指令的两个操作数中有一个必为寄存器,另一个操作数可能是寄存器,也可能是存储器单元,由指令代码的第二个字节的MOD和R/M字段指定。如表3-2所示。(24种不同的编码格式,D8表示8位位移量,D16为16位位移量)对指令进行编码时,若包含8位位移量,则在编码后增加一个宇节存放位移量disp-L;若包含16位的位移量,则增加2个字节存放位移量:第3个字节存放位移量的低字节disp-L,第4个字节存放位移量高字节disp-H。34§3-2指令的机器码表示方法——指令代码的编制

对MOV指令进行编码的几个示例:2.寄存器间传送指令的编码:

例求指令MOVSP,BX的机器码解:指令的功能是将BX寄存器的内容送到SP寄存器中。从附录B可知,该指令的操作码为1000l0;传送的是字数据,所以w=1;

REG字段:选择将SP,则REG字段编码=100;

D位=1,表示数据传至所选的寄存器(SP);

MOD=11,因另一个操作数BX也是寄存器。从表3-2查得R/M=011。根据W=l及寄存器名称为BX,求得指令编码。35§3-2指令的机器码表示方法——指令代码的编制

3.寄存器与存储器间传送指令的编码

例:求指令MOVCL,[BX+l234H]的机器码。解:功能:将有效地址为(BX+1234H)存储单元中的数据字节传送到CL寄存器中;指令的编码如图2-10中所示。第1、2字节可通过查表得到;第3字节存放l6位位移量的低字节34H;第4字节存放高字节12H。所以该指令的编码为8A8F3412H。36§3-2指令的机器码表示方法——指令代码的编制

4.立即数寻址指令的编码立即数寻址的指令:操作码+1~2个字节用于存放立即数据。

例求指令MOV[BX十2100H],0FA50H的机器码。解:指令的功能:将16位立即数FA50H送到有效地址为(BX+2100H)的字存储单元中;指令编码如图3-11中所示;其中:低字节50H送列〔BX+2100H〕单元,高字节FAH送到(BX+2101H)单元;指令中不但有16位立即数,还有16位位移量;查附录B知,该指令的6字节编码为:C787002150FA。37§3-2指令的机器码表示方法——指令代码的编制

5.包含段寄存器的指令的编码

含有段寄存器的指令,寄存器字段REG占有2位,从表3-1可得,相应的编码为:CS=01,DS=11,ES=00,SS=l0。例求指今MOVDS,AX的机器码。解:指令功能:将AX寄存器的内容传送到数据段寄存器DS;该指令的编码格式为:10001110MOD0REGR/M;段寄存器DS的编码为11,即REG字段为11;另一个操作数也是寄存器,所以MOD=11,而R/M字段应填上AX的三位代码000;得到该指令的编码为:8ED8H。

38§3-2指令的机器码表示方法——指令代码的编制

6.段超越前缀指令的编码该类指令进行编码时,在指令代码前加一个8位的段超越的缀代码,代码的格式为001××110,其中××位表明段超越寄存器,编码与上面列出的相同。SS:36H、DS:3EH、ES:26H、CS:2EH

39§3-38086的指令系统

§3-38086的指令系统

——

分类

按功能分为以下六类:

数据传送指令

算术运算指令

逻辑运算和移位指令

字符串处理指令

控制转移指令

处理器控制指令40介绍具体指令之前,首先介绍一下指令系统中操作数的种类和含义。REG:通用寄存器(或寄存器);

SREG:段寄存器

Memory:存储器;

immediate:立即数41一、数据传送指令注:◎数据传送指令共14条;◎除SAHF和POPF指令外,对标志位均没有影响。§3-38086的指令系统

——数据传送指令

通用数据传送指令MOVPUSHPOPXCHGXLAT字节或字的传送入栈指令出栈指令交换字或字节表转换输入输出指令INOUT输入输出地址目标传送指令LEALDSLES装入有效地址装入数据段寄存器装入堆栈段寄存器标志传送指令LAHFSAHFPUSHFPOPF标志寄存器低字节装入AHAH内容装入标志寄存器低字节标志寄存器入栈指令出栈,并送入标志寄存器421.通用数据传送指令(GeneralPurposeDataTranfer):§3-38086的指令系统

——数据传送指令

⑴MOV传送指令(Move)

指令格式:MOV目的,源

指令功能:实现CPU的内部寄存器间或寄存器与存储器间的数据传送。43§3-38086的指令系统

——数据传送指令

注意:▲指令中至少要有—项明确说明传送的是字节还是字;▲IP寄存器不能用作源操作数或目的操作数;▲立即数和CS寄存器不能用作目的操作数;▲MOV指令不能在两个存储单元之间直接传送数据,也不能在两个段寄存器之间直接传送数据。44§3-38086的指令系统

——数据传送指令

MOV指令应用举例:操作数通常存放在数据段中,所以先要定义数据段。例如,某个程序的数据段:

DATA SEGMENT ;数据段开始AREA1 DB14H,3BH;定义字节变量AREA2 DB3DUP(0);复制操作ARRAY DW3l00H,01A6H;定义字变量STRING DB‘GOOD’

DATA ENDS ;数据段结束

汇编后,DATA将被赋予一个具体的段地址。各变量将自偏移地址0000H开始依次存放,各符号地址等于它们在数据段中的偏移量。AREA1的偏移地址为0000H,AREA2的偏移地址为0002H,ARRAY的偏移地址为0005H,STRING的偏移地址为0009H。45§3-38086的指令系统

——数据传送指令

例3.26MOVDX,OFFSETARRAY解:ARRAY的偏移地址DX。(OFFSET:取后面的符号偏移地址的值)设:ARRAY的定义如上图所示则:DX=0005H例3.27MOVAL,AREA1 ;ALAREA1中的内容14H

MOVAREA2,AL ;0002H单元14H

例3.28MOVAX,TABLE[BP][DI]解:将地址为l6×SS+BP+DI+TABLE的字存储单元中的内容送进AX。46

§3-38086的指令系统

——数据传送指令

⑵PUSH进栈指令指令格式:PUSH源

指令功能:数据入堆栈

工作过程:SP←SP-2;(SP+1,SP)←源源操作数要求:可以是16位通用寄存器、段寄存器、存储器中的数据字,但不能是立即数。

⑶POP出栈指令指令格式:POP目的指令功能:数据出堆栈

工作过程:目的←(SP+1,SP);SP←SP+2;目的操作数要求:可以是16位通用寄存器、段寄存器、存储单元,但CS不能作目的操作数。…最后一项高地址栈底(SP)压入弹出栈顶(SS)最大容量64KSP总是指向偶地址单元段址47§3-38086的指令系统

——数据传送指令

堆栈指令的工作过程举例:例3.29设SS=2000H,SP=40H,BX=3120H,AX=25FEH,依次执行下列指令:PUSHBXPUSHAXPOPBX堆栈中的数据和SP的变化情况如图3.14所示。48

§3-38086的指令系统

——数据传送指令

⑷XCHG交换指令(Exchange)

指令格式:XCHG目的,源

指令功能:源操作数、目的操作数数据交换。操作数要求:交换可以在寄存器之间、寄存器与存储器之间进行;段寄存器不能作为操作数;不能直接交换两个存储单元中的内容。例3.30

设AX=2000H,DS=3000H,BX=1800H,(3lA00H)=1995H。则执行指令XCHGAX,[BX+200H]后,结果如何?解:把内存中的一个字与AX中的内容进行交换。源操作数的物理地址=3000H×10H十1800H十200H=31A00H,指令执行后:AX=1995H,(3lA00H)=2000H49

§3-38086的指令系统

——数据传送指令

指令格式:XLAT转换表或:XLAT指令功能:AL=DS:[BX+unsignedAL]使累加器(AL)中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换,即查表功能。XLAT指令使用步骤:使用之前必须先建立一个表格,表格中的内容是所需要转换的代码;将转换表的起始地址装入BX寄存器;欲查的某项与表头地址的位移量AL,即表格最多包含256个字节;执行XLAT指令后,根据位移量从表中查到转换后的代码值AL寄存器中。⑸XLAT表转换指令(TableLookup—Translation)50

§3-38086的指令系统

——数据传送指令

例3.31若十进制数字0~9的LED七段码对照表如下表所示,试用XLAT指令求数字5的七段码值。解:程序如下:TABLEDB40H,79H,24H,30H,19H ;建表,表格起始地址为TABLEDB12H,02H,78H,00H,18H ;七段码存于对TABLE的;位移量为0~9的单元位移 ……………MOV AL,5 ;AL数字5的位移量MOV BX,OFFSETTABLE ;BX表格首地址XLATTABLE ;查表得:AL=12H十进制数字七段显示码十进制数字七段显示码040H512H179H602H224H778H330H800H419H918H51

§3-38086的指令系统

——数据传送指令

2.输入输出指令(InputandOutput):IN指令:指定端口中的数据→累加器OUT指令:累加器中的数据→指定端口⑴IN输入指令(Input)

指令格式:

①INAL,端口地址;端口地址(00~FFH)直接包含在IN指令里,或INAX,端口地址;共允许寻址256个端口。直接寻址

②INAL,DX;端口地址>0FFH时,先将端口号送DX寄存器,再执行输入操作。或INAX,DX;共允许寻址64K个端口。间接寻址指令功能:

从8位端口读入一个字节到AL寄存器,或从16位端口读一个字到AX寄存器。注意:16位端口由两个地址连续的8位端口组成。52§3-38086的指令系统

——数据传送指令

例3.32INAL,0F1H

;AL从F1H端口读入一个字节INAX,80H ;AL80H口的内容,AH81H口的内容MOVDX,310H

;端口地址310H先送入DX中INAL,DX

;AL310H端口的内容

53§3-38086的指令系统

——数据传送指令

⑵OUT输出指令(Output)指令格式:①OUT端口地址,AL;端口地址(00~FFH)直接包含在IN指令里,或OUT端口地址,AX;共允许寻址256个端口。直接寻址②OUTDX,AL;端口地址>0FFH时,先将端口号送DX寄存器,;再执行输出操作。或OUTDX,AX;当共允许寻址64K个端口。间接寻址指令功能:将AL中的一个字节写到一个8位端口,或把AX中的一个字写到一个16位端口。注意:对16位端口进行输出操作时,是对两个连续的8位端口进行输出操作。54§3-38086的指令系统

——数据传送指令

例3.34OUT85H,AL ;85H端口AL内容

MOVDX,0FF4H ;端口地址DX=0FF4H OUTDX,AL ;0FF4H端口AL内容MOVDX,300H ;DX指向300HOUTDX,AX ;300H端口AL内容,301H端口AH内容553.地址目标传送指令(AddressObjectTransfers):§3-38086的指令系统

——数据传送指令

共三条指令:传送地址码。可传送操作数的段地址和偏移地址。⑴LEA取有效地址指令(LoadEffectiveAddress)

指令格式:LEA目的,源

指令功能:源操作数地址的偏移量→目的操作数所在寄存器

要求:

源操作数:必须是存储单元;

目的操作数:必须是一个除段寄存器之外的16位寄存器。

注意:与MOV指令的区别。56§3-38086的指令系统

——数据传送指令

例3.35假设SI=1000H,DS=5000H,(51000H)=1234H

LEABX,[SI]

;执行完该指令后,BX=l000H

MOVBX,[SI] ;执行完该指令后,BX=1234H例3.36LEABX,TABLE

;可用MOV指令代替LEA指令

MOVBX,OFFSETTABLE ;两条指令等价。

例3.37某数组含20个元素,每个元素占一个字节,符号为:0~19。设DI指向数组开头处,把序号为6的元素的偏移地址送到BX中,用什么指令来实现?解:LEABX,6[DI] ;只能用LEA实现,不能用MOV57§3-38086的指令系统

——数据传送指令

⑵LDS将双字指针送到寄存器和DS指令(LoadPointerusingDS)指令格式:LDS 目的,源指令功能:LoadmemorydoublewordintowordregisterandDS其中:前两个字节(偏移地址)→指定的目的寄存器;(常用SI寄存器)

后两个字节(段地址)→DS寄存器。操作数要求:源操作数:必须是存储单元(该单元开始的连续4个字节存放一个变量的地址指针);目的操作数:必须是16位寄存器,常用SI寄存器,但不能用段寄存器。58例3.38

设:DS=1200H,(12450H)=0F346H,(12452H)=0A90H。执行指令LDSSI,DS:[450H]后,结果如何?解:SI=0F346H,DS=0A90H59§3-38086的指令系统

——数据传送指令

⑶LES将双字指针送到寄存器和ES指令(LoadPointerusingES)

指令格式:LES 目的,源指令功能:LoadmemorydoublewordintowordregisterandES.其中:前两个字节(偏移地址)→指定的目的寄存器;(常用DI寄存器)

后两个字节(段地址)→ES寄存器。

例3.39设:DS=0100H,BX=0020H,(01020H)=0300H,(01022H)=0500H。执行指令LESDI,[BX]后,结果如何?解:DI=0300H,ES=0500H604.标志传送指令(FlagTransfers):4条§3-38086的指令系统

——数据传送指令

读取标志指令:LAHF

(5、3、1为任意值)--标志寄存器低8位→AH设置标志指令:SAHF--标志寄存器低8位←AH把标志寄存器的内容压入堆栈:PUSHF从堆栈弹出到标志寄存器:POPF1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D061§3-38086的指令系统

——数据传送指令

⑴LAHF标志送到AH指令(LoadAHfromFlag)指令格式:LAHF指令功能:标志寄存器SF、ZF、AF、PF和CF

AH寄存器的位7、6、4、2和0。注意:◎位5、3、1的内容未定义,(一般1位是1,3、5位是0)。◎执行这条指令后,标志位本身并不受影响。1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D062指令英文说明63§3-38086的指令系统

——数据传送指令

⑵SAHFAH送标志寄存器(StoreAHintoFlags)

指令格式:SAHF指令功能:AH内容

→标志寄存器。

注意:◎位5、3、1的内容未定义,(一般1位是1,3、5位是0)。◎执行这条指令后,高位标志并不受影响。

1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D064指令英文说明65§3-38086的指令系统

——数据传送指令

⑶PUSHF标志入栈指令(PushFlagontoStack)指令格式:PUSHF指令功能:整个标志寄存器的内容

堆栈;

修改堆栈指针,使SPSP-2;指令执行后对标志位无影响。⑷POPF标志出栈指令(PopFlagoffStack)

指令格式:POPF指令功能:堆栈指针SP所指的一个字

标志寄存器PSW;

修改堆栈指针,使SPSP+2。

66注意:▲要成对使用PUSHF和POPF,可对标志寄存器进行保存和恢复。▲常用在:过程(子程序)调用,中断服务程序,对主程序的状态(即标志位)进行保护。▲也可用来改变追踪标志TF。在8086指令系统中没有直接改变TF(D8位)的指令。67作业120~121页,2、3、6、868§3-38086的指令系统

——算术运算指令二、算术运算指令算术运算指令可处理4种类型的数无符号二进制整数带符号二进制整数无符号压缩十进制整数(PackedDecimal)无符号非压缩十进制整数(UnpackedDecimal)

一个8位二进制数可看成4种不同类型的数,所表示的数值亦不同。69§3-38086的指令系统

——算术运算指令数的表示:

二进制数:可以是8位或16位,若是带符号数,则用补码表示。压缩十进制数:一个字节中存放两个BCD码十进制数。非压缩十进制数:—个字节的低半字节存放十进制数,高半字节为全零。例如,对十进制数字58:压缩十进制数表示:只需一个字节,即01011000B;非压缩十进制数表示:需两个字节,即00000101B

和00001000B。表3.54种数的类型的表示方法二进制码(B)十六进制(H)无符号二进制(D)带符号二进制(D)非压缩十进制压缩十进制00000111077+77071000100189137-119无效8911000101C5197-59无效无效70§3-38086的指令系统

——算术运算指令注意:算术运算指令处理的数都必须是有效的,否则会导致错误的结果。8086/8088指令系统提供:加、减、乘、除四种基本运算指令:处理无符号或带符号的8位/16位二进制数的算术运算;调整操作指令:进行压缩的或非压缩的十进制数的算术运算;绝大部分算术运算指令都影响状态标志位。加法和减法运算指令:带符号数和无符号数的加法和减法的运算可以用同一条加法或减法指令来完成。乘法和除法运算:分别设置不同乘、除法指令。71§3-38086的指令系统

——算术运算指令表3.6算术运算指令的分类加法ADDADCINCAAADAA加法带进位的加法增量加法的ASCII调整加法的十进制调整减法SUBSBBDECNEGCMPAASDAS减法带借位的减法减量取补比较减法的ASCII调整减法的十进制调整乘法MULIMULAAM无符号数乘法整数乘法乘法的ASCII调整除法DIVIDIVAADCBWCWD无符号数除法整数除法除法的ASCII调整把字节转换成字把字转换成双字721.加法指令(Addition)⑴ADD加法指令(Addition)

指令格式:ADD目的,

源指令功能:目的

目的

⑵ADC带进位的加法指令(AdditionwithCarry)

指令格式:ADC目的,

指令功能:目的

目的

十CF操作数的要求:(包括上两条指令)源操作数:可以是寄存器、存储器、立即数;目的操作数:只能用寄存器、存储单元。注意:

★源、目的操作数不能同时为存储器,且类型必须一致,即都是字节或字;

★这两条指令影响的标志位为:CF、OF、PF、SF、ZF和AF。§3-38086的指令系统

——算术运算指令73§3-38086的指令系统

——算术运算指令

例3.40两种加法指令的实例ADDAL,18H

;ALAL十18H

ADCBL,CL

;BLBL十CL十CFADCAX,DX

;AXAX十DX十CFADDAL,COST[BX] ;AL内容和地址=DS:(COST+BX)的存储字节相加,;结果送ALADDCOST[BX],BL

;将BL与物理地址=DS:(COST十BX)的存储字节相加,;结果留在该存储单元中

例3.41用加法指令对两个8位16进制数5EH和3CH求和,并分析加法运算指令执行后对标志位的影响。解:MOVAL,5EH ;AL=5EH(94)MOVBL,3CH ;BL=3CH(60)ADDAL,BL ;结果AL=9AH74§3-38086的指令系统

——算术运算指令讨论:

ADD对标志位的影响▲两个数的相加过程:010111105EH=94

+00111100即:+3CH=60100110109AH=154运算后标志位:ZF=0,AF=1,CF=0,SF=l,PF=1,OF=1。▲对标志的解释:人为决定①两个加数都看成无符号数时,运算结果为9AH,即十进制数154。在这种情况下,SF和OF都没有意义,我们只关心ZF和CF标志,在BCD码运算或奇偶校验时才考虑AF或PF标志。②两个加数都当成带符号数时,符号标志SF和溢出标志OF很重要,而进位标志CF没有意义。带符号数能表示的范围-128~+127,而本例中,两个正数94和60相加,其和为154,由于154超过了范围,即产生了溢出,OF=175§3-38086的指令系统

——算术运算指令⑶INC增量指令(Increment)指令格式:INC目的指令功能:目的目的十1操作数的要求:通用寄存器、内存。注意:▲这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改;▲指令执行后影响AF、OF、PF、SF和ZF,但不影响进位标志CF。▲该指令只有一个操作数时,如果要使内存单元的内容增1,程序中必须说明该存储单元是字还是字节。INC指令的两个应用例子:例3.42INCBL ;BL寄存器中内容增1

INCCX ;CX寄存器中内容增1

例3.43

INCBYTEPRR[BX];内存字节单元内容增1INCWORDPTR[BX];内存字单元内容增1其中:PTR为类型说明符,前面加BYTE说明操作数类型为字节,加WORD则说明操作数类型为字。76§3-38086的指令系统

——算术运算指令⑷AAA加法的ASCII调整指令(ASCIIAdjustforAddition)指令格式:AAA指令功能:将AL寄存器中的运算结果调整为1位非压缩十进制数,仍保留在AL。如果AF=1,表示向高位有进位,则进到AH寄存器中。使用前提:用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法,运算结果已存在AL。(注:非压缩十进制数的高4位为全0,低4位为十进制数字0~9。例如,将9表示成00001001)

调整过程:若AL低4位>9或AF=1

则:①ALAL十6②用与操作(∧)将AL高4位清0③AF置1,CF置1,AHAH十l

否则:将AL寄存器的高4位清0。77§3-38086的指令系统

——算术运算指令例3.44若AL=BCD9,BL=BCD5,求两数之和。解:设AH=0,则运算过程如下:

ADD AL,BL ; 00001001……09H ;+ 00000101……05H ;______________________________ AAA ; 00001110……低4位>9 ;+ 00000110……加6调整 ;______________________________ ; 00010100 ;∧ 00001111……清高4位 ;______________________________ ; 00000100……AL=04H ; CF=1,AF=1,AH=1 ;结果为AX=0104H,表示非压缩十进制数14

ASCII码表示的十进制数,高半字节均为3,运算时需用AND指令将它屏蔽。只要使用AAA指令,可以不必屏蔽高半字节,便能在AX中得到一个正确的非压缩十进制数。78§3-38086的指令系统

——算术运算指令例3.45求ASCII码表示的数9(39H)与5(35H)之和。解:设AH=0,则运算过程如下:

MOV AL,‘9’ ;AL=39H MOV BL,‘5’ ;BL=35H ADD AL,BL ; 00111001……‘9’ ;+ 00110101……‘5’ ;______________________________ AAA ; 01101110……低4位>9 ;+ 00000110……加6调整 ;______________________________ ; 01110100 ;∧ 00001111……清高4位 ;______________________________ ; 00000100……AL=4 ; CF=1,AF=1,AH=1 ;结果为AX=0104H,表示非压缩十进制数14在AAA指令后加上一条“或”指令ORAX,3030H,便使AX中的结果变成了ACSII码3134H。79§3-38086的指令系统

——算术运算指令⑸DAA加法的十进制调整指令(DecimalAdjustforAddition)指令格式:DAA指令功能:将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。使用前提:相加后的结果必须在AL中,才能使用DAA指令。

调整过程:①若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;②若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。80§3-38086的指令系统

——算术运算指令例3.46若AL=BCD38,BL=BCDl5,求两数之和。解:运其过程如下: ADD AL,BL ; 00111000……38H ;+ 00010101……15H ;______________________________ DAA ; 01001101……低4位>9 ;+ 00000110……加6调整 ;______________________________ ; 01010011……AL=53H ;结果为:AL=BCD53,CF=0调整过程:①若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;②若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。81§3-38086的指令系统

——算术运算指令例3.47若AL=BCD88,BL=BCD49,求两数之和。解:运算过程为: ADD AL,BL ; 10001000……88H ;+ 01001001……49H ;______________________________ DAA ; 11010001……AF=1,低4位<9 ;+ 00000110……加6调整 ;______________________________ ; 11010111……调整后,高4位>9 ;+ 01100000……加60H调整 ;______________________________ ; 00110111……AL=37H ;结果为:AL=BCD37,CF=1调整过程:①若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;②若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。82§3-38086的指令系统

——算术运算指令2.减法指令(Subtraction)

⑴SUB减法指令(Subtraction)指令格式:SUB目的,源指令功能:目的目的-源例3.48SUBAX,BX ;AXAX—BX

SUBDX,1850H ;DXDX—1850H

83§3-38086的指令系统

——算术运算指令⑵SBB带借位的减法指令(SubtractwithBorrow)指令格式:SUBB目的,源指令功能:目的目的-源-CF(SBB主要用于多字节减法中)例3.49SUBBAL,CL ;ALAL-CL-CF

⑶DEC减量指令(Decrement)指令格式:DEC目的指令功能;目的目的一l例3.50DECBX ;BXBX—1DECWORDPTR[BP] ;堆栈段中位于[BP]偏置处的字减184§3-38086的指令系统

——算术运算指令⑷NEG取负指令(Negate)指令格式:NEG 目的指令功能:目的0-目的,即:对目的操作数取负例3.51NEGAX ;将AX中的数取负

NEGBYTEPTR[BX] ;对数据段中位于[BX]偏置处的字节取负

⑸CMP比较指令(Compare)

指令格式:CMP 目的,源指令功能:目的-源

注意:结果不回送到目的操作数中,仅反映在标志位上。

用途:用在比较两个数大小又不破坏原操作数的场合。

例3.52CMPAL,80H;AL与80H作比较

CMPBX,DATA1;BX与数据段中偏移量为DATA1处的字比较

85§3-38086的指令系统

——算术运算指令减法指令小结:(上述五种指令都做减法运算)①对于双操作数指令(SUB、SBB、CMP):▲源操作数可以是寄存器、存储器或立即数;▲目的操作数可以是寄存器、存储器,但不能为立即数;▲两个操作数不能同时为存储器。②对于单操作数指令(DEC、NEG):▲目的操作数可以是寄存器、存储器,但不能为立即数;▲如果是存储器操作数,还必须说明其类型是字节还是字。③运算之后,除DEC指令不影响CF标志外,它们均影响OF、SF、ZF、AF、PF和CF标志。④在减法操作后,如果源操作数大于目的操作数,需要借位时,进位/借位标志CF将被置1。

86§3-38086的指令系统

——算术运算指令

例3.53设AL=10110001B,DL=01001010B,求AL-DL。解:SUBAL,DL;与加法操作一样,对结果的解释取决于参与运算的数的性质运算过程如下:

二进制减法 当成无符号数 当成带符号数 10110001 177 - 79- 01001010 -74 -)+74---------------------- ------------- ----------------- 01100111 103 +103 运算后标志位:ZF=0,AF=1,CF=0,SF=0,PF=0,OF=1讨论:▲两数为无符号数:表示177与74的差是103。CF=0表示没有借位,SF和OF无意义。▲两数为带符号数:表示-79-(+74),结果应为-153。但结果却为正数(103),这是由于-153溢出造成的。此时,SF和OF有重要意义。

87§3-38086的指令系统

——算术运算指令⑹AAS减法的ASCII调整指令(ASCIIAdjustforSubtraction)指令格式:AAS指令功能:将AL寄存器中的运算结果调整为正确的非压缩,十进制数之差,仍保留在AL中。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论