微机原理与接口技术-第3章8086的寻址方式和指令系统_第1页
微机原理与接口技术-第3章8086的寻址方式和指令系统_第2页
微机原理与接口技术-第3章8086的寻址方式和指令系统_第3页
微机原理与接口技术-第3章8086的寻址方式和指令系统_第4页
微机原理与接口技术-第3章8086的寻址方式和指令系统_第5页
已阅读5页,还剩226页未读 继续免费阅读

下载本文档

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

文档简介

微机原理与接口技术主讲尹作友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的寻址方式——概述

寻址方式举例:10§3-18086的寻址方式——概述

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

一、立即寻址方式(ImmediateAddressing)

1.含义:操作数是立即数(即8位或16位的常数),直接包含在指令中。2.特点:翻译成机器码时,立即数是指令的一部分,紧跟在操作码之后存放在代码段内。在取出指令的同时也就取出了操作数,立即有操作数可用,所以称之为立即寻址。

l6位数:高字节→代码段的高地址单元,低字节→低地址单元;3.作用:常用于给寄存器赋初值。12§3-18086的寻址方式——立即寻址方式

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

二、寄存器寻址方式(RegisterAddressing)

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

解:(AX)送到CX寄存器中。(AX内容不变)(又例:MOVBL,AL)4.注意:源操作数的长度必须与目的操作数—致。(注:以下寻址方式下,指令的操作数在存储器中,要先求物理地址才能获得操作数。)

14§3-18086的寻址方式——直接寻址方式三、直接寻址方式(DirectAddressing)

1.含义:

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

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

15§3-18086的寻址方式——直接寻址方式

例MOVAX,[2000H]解:设DS=3000H;设:(32000H)=1234H由指令得:EA=2000H(16位逻辑地址)物理地址=16×3000H+2000H=32000H(20位,20根地址线)则:AX=1234H指令执行过程如图所示。(注:如用AL替代AX,则AL=34H)16§3-18086的寻址方式——直接寻址方式

2.段超越前缀MOV AX, ES:[500H]3.符号地址AREA1 EQU 0867H……MOV AX, AREA1等价为MOV AX, [AREA1]17§3-18086的寻址方式——寄存器间接寻址方式四、寄存器间接寻址方式(RegisterIndirectAddressing)1.含义:操作数的有效地址放在寄存器中。2.特点:使用寄存器:基址寄存器BX、BP,变址寄存器SI、DI。操作数的物理地址=16×DS+BX/SI/DI或=16×SS+BP3.作用:有效地址可以存放在寄存器中。

18§3-18086的寻址方式——寄存器间接寻址方式例MOVBX,[SI]解:设:DS=1000H,SI=2000H,(12000H)=318BH则:物理地址=16×DS+SI=10000H+2000H=12000H指令执行后,BX=318BH,指令执行过程如图所示。19

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

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

§3-18086的寻址方式——寄存器间接寻址方式20§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

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

3.注意:▲寄存器名称外必须加方括号,位移量可以在括号内,也可以在括号外;▲段超越前缀来从默认段以外的段中取得数据;例MOVDH,ES:ARRAY[SI]▲关于默认段:指定寄存器BX、SI或DI,默认操作数存放在数据段DS中;(DS:BX,SI,DI)

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

(SS:BP)

§3-18086的寻址方式——寄存器相对寻址方式23§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不能同时出现在[]中。24§3-18086的寻址方式——基址变址寻址方式例MOVAX,[BX]

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

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

寻址方式总结:▲带方括号的地址表达式必须遵循下列规则:1.立即数可以出现在方括号内,表示直接地址,如[2000H]。2.只有BX、BP、SI、DI这四个寄存器可以出现在[]内,它们可以单独出现,也可以相加,或与常数相加,但:BX和BP寄存器、SI和DI寄存器不允许出现在同一个[]内。

3.方括号表示相加,下面几种写法等价:6[BX][SI];[BX+6][SI];[BX+SI+6]28§3-18086的寻址方式——寻址方式总结4.不同寄存器对应不同的隐含段基址:SS:BP;DS:BX,SI,DI;物理地址=16×相应段基址+EAEA=BX/BP+SI/DI+DISP(注:可以是单一寄存器、两个寄存器组合、和DISP组合;DISP也可以为0)▲可用段超越前缀修改段基址。29§3-18086的寻址方式——其它八、其它1.隐含寻址:指令中不指明操作数,但有隐含规定的寻址方式。如:指令DAA;对寄存器AL中的数据进行十进制数调整,结果仍保留在AL中。2.I/O端口寻址:8086有直接端口和间接端口两种寻址方式。

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

30§3-18086的寻址方式——其它

▲间接端口寻址方式:端口地址由寄存器DX提供,端口号为0000—FFFFH。例如,MOV DX,213H ;DX=口地址号213HINAL,DX;AL←端口213H中的内容3.一条指令有多种寻址方式:源操作数和目的操作数同样适用上述寻址方法。例MOV[BX],AL解:设:BX=3600H,DS=1000H,AL=05H则:目的操作数的物理地址=16×DS+BX=10000H十3600H=13600H指令执行结果为(13600H)=05H。313.DS=1000H,ES=2000H,SS=3500H,SI=00A0H,DI=0024H,BX=0100H,BP=0200H,AL=0030H(1)MOVAX, [100H]直接寻址方式,10100H

物理地址=DS×10H+100H=10000H+0100H=10100H(2)MOVAX, VAL直接寻址方式,10030H

物理地址=DS×10H+VAL=10000H+0030H=10030H

(3)MOVAX, [BX]寄存器间接寻址,10100H

物理地址=DS×10H+BX=10000H+0100H=10100H(4)MOVAX, ES:[BX]寄存器间接寻址,20100H

物理地址=ES×10H+BX=20000H+0100H=20100H2/3/2023(5)MOVAX, [SI]寄存器间接寻址,100A0H物理地址=DS×10H+SI=10000H+00A0H=100A0H(6)MOVAX, [BX+10H]寄存器相对寻址,10110H物理地址=DS×10H+BX+10H=10000H+0100H+10H=10110H(7)MOVAX, [BP]寄存器间接寻址,35200H物理地址=SS×10H+BP=35000H+0200H=35200H33(8)MOVAX, VAL[BP][SI] 相对基址变址寻址,352D0H物理地址=SS×10H+BP+SI+VAL=35000H+0200H+00A0H+0030H=352D0H(9)MOVAX, VAL[BX][DI] 相对基址变址寻址,10154H物理地址=DS×10H+BX+DI+VAL=10000H+0100H+0024H+0030H=10154H(10)MOVAX, [BP][DI] 基址变址寻址,35224H物理地址=SS×10H+BP+DI=35000H+0200H+0024H=35224H2/3/2023§3-2指令的机器码表示方法一、机器语言指令的编码目的和特点§3-2指令的机器码表示方法——目的和特点

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

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

15876543210100010DWMODREGR/M 操作码36§3-2指令的机器码表示方法——指令代码的编制

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

例如:REG=010,W=1时表示寻址DX寄存器;REG=010,W=0时寻址DL寄存器。37§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。38§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,求得指令编码。39§3-2指令的机器码表示方法——指令代码的编制

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

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

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

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

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

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

6.段超越前缀指令的编码该类指令进行编码时,在指令代码前加一个8位的段超越的缀代码,代码的格式为001××110,其中××位表明段超越寄存器,编码与上面列出的相同。

例若指令MOV[BX],DL的编码为8817H,试求指令MOVCS:[BX],DL的代码。解:该指令的编码是在不带段超越前缀的指令代码8817H前,加上一个字节001××110。由于段寄存器CS的代码为01,所以指令的第1个字节的编码为00101110,即2EH。

可得到该指令的机器码为2E8817H43上次课内容回顾及问题:1.指令系统的寻找方式有哪些?2.哪些寻址方式与存储单元有关?3.这些寻址方式哪种较快?4.源操作数和目标操作数数据类型有什么要求?指令编码部分(自学),上机时总结。44§3-38086的指令系统§3-38086的指令系统

——

分类

分为以下六类:

数据传送指令

算术运算指令

逻辑运算和移位指令

字符串处理指令

控制转移指令

处理器控制指令45一、数据传送指令注:◎数据传送指令共14条;◎除SAHF和POPF指令外,对标志位均没有影响。§3-38086的指令系统

——数据传送指令

通用数据传送指令MOVPUSHPOPXCHGXLAT字节或字的传送入栈指令出栈指令交换字或字节表转换输入输出指令INOUT输入输出地址目标传送指令LEALDSLES装入有效地址装入数据段寄存器装入堆栈段寄存器标志传送指令LAHFSAHFPUSHFPOPF标志寄存器低字节装入AHAH内容装入标志寄存器低字节标志寄存器入栈指令出栈,并送入标志寄存器重点掌握的指令:MOV、PUSH、POP、XCHG、XLAT、IN、OUT、LEA461.通用数据传送指令(GeneralPurposeDataTranfer):§3-38086的指令系统

——数据传送指令

⑴MOV传送指令(Move)

指令格式:MOV目的,源指令功能:实现CPU的内部寄存器间或寄存器与存储器间的数据传送。例:MOVAX,0FF00H;MOV[DI],AX;MOVCX,[1000H];MOVBL,40MOVWORDPTR[SI],01H;MOVAL,BL;47§3-38086的指令系统

——数据传送指令

注意:▲指令中至少要有—项明确说明传送的是字节还是字;▲IP寄存器不能用作源操作数或目的操作数;▲立即数和CS寄存器不能用作目的操作数;▲除了源操作数为立即数的情况外,两个操作数中必有一个是寄存器,但不能都是段寄存器;这就是说,MOV指令不能在两个存储单元之间直接传送数据,也不能在两个段寄存器之间直接传送数据。48▲所谓“传送”,实值是复制,把的内容复制到目的操作数,源操作数内容不变。▲目的操作数和源操作数不能同时为内存单元。▲目的操作数和源操作数不能同时为段寄存器。▲目的操作数为段寄存器时,源操作数不能为立即数。对段寄存器赋值必须通过通用寄存器作中介。§3-38086的指令系统

——数据传送指令

这些注意事项基本适合所有指令49§3-38086的指令系统

——数据传送指令

CS一般不为目标操作数50§3-38086的指令系统

——数据传送指令

通常,数据通常存放在数据段中。例如,某个程序的数据段:

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

DATA ENDS;数据段结束

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

——数据传送指令

数据段开始52§3-38086的指令系统

——数据传送指令

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

MOVAREA2,AL ;0002H单元14H

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

§3-38086的指令系统

——数据传送指令

⑵PUSH进栈指令

指令格式:PUSH源

指令功能:数据入堆栈

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

…最后一项高地址栈底(SP)压入弹出栈顶(SS)最大容量64KSP总是指向偶地址单元段址54⑶POP出栈指令指令格式:POP目的指令功能:数据出堆栈

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

——数据传送指令

5556

§3-38086的指令系统

——数据传送指令

⑷XCHG交换指令(Exchange)

指令格式:XCHG目的,源

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

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

§3-38086的指令系统

——数据传送指令

指令格式:XLAT转换表或:XLAT指令功能:

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

§3-38086的指令系统

——数据传送指令

例若十进制数字0~9的LED七段码对照表如下表所示,试用XLAT指令求数字5的七段码值。解:程序如下:

TABELDB40H,79H,24H,30H,19H;建表,表格起始地址为TABLEDB12H,02H,78H,00H,18H ;七段码存于对TABLE的;位移量为0~9的单元位移 ……………MOV AL,5 ;AL数字5的位移量MOV BX,OFFSETTABLE ;BX表格首地址XLATTABLE ;查表得:AL=12H十进制数字七段显示码十进制数字七段显示码040H512H179H602H224H778H330H800H419H918H59下列指令是否合法?XCHGBX,[BP+SI]XCHGAL,BHPOPCSPUSH1234HMOV[SI],[2000H]MOVCS,BXMOV2000H,AXMOVSI,

[SI+6]§3-38086的指令系统

——数据传送指令

60MOV[BX],20H在MASM5.0下编译,报错,必须指明数据大小,8位/16位。在MASM6.11下编译,无错,汇编程序编译时自动识别为MOVWORDPTR[BX],20HMOV[BX],200H在MASM5.0和MASM6.11下编译,均无错,汇编程序编译时自动识别为MOVWORDPTR[BX],200H§3-38086的指令系统

——数据传送指令

61

§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寄存器。62§3-38086的指令系统

——数据传送指令

注意:

16位端口由两个地址连续的8位端口组成。

16位端口输入:先将给定端口中的字节送进AL;再把端口地址加1,然后将该端口中的字节读入AH。例INAL,0F1H;AL从F1H端口读入一个字节INAX,80H ;AL80H口的内容,AH81H口的内容MOVDX,310H ;端口地址310H先送入DX中INAL,DX;AL310H端口的内容

63§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位端口进行输出操作。64§3-38086的指令系统

——数据传送指令

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

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

——数据传送指令

共三条指令:传送地址码。可传送操作数的段地址和偏移地址。⑴LEA取有效地址指令(LoadEffectiveAddress)指令格式:LEA目的,源指令功能:源操作数地址的偏移量→目的操作数所在寄存器要求:

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

目的操作数:必须是一个除段寄存器之外的16位寄存器。注意:与MOV指令的区别。66§3-38086的指令系统

——数据传送指令

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

LEABX,[SI] ;执行完该指令后,BX=l000H

MOVBX,[SI] ;执行完该指令后,BX=1234H例LEABX,TABLE ;可用MOV指令代替LEA指令

MOVBX,OFFSETTABLE ;两条指令等价。

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

——数据传送指令

⑵LDS将双字指针送到寄存器和DS指令(LoadPointerusingDS)指令格式:LDS 目的,源指令功能:源操作数指定的存储单元中的4字节地址指针→一对目的寄存器。其中:前两个字节(偏移地址)→指定的目的寄存器;(常用SI寄存器)后两个字节(段地址)→DS寄存器。操作数要求:源操作数:必须是存储单元(该单元开始的连续4个字节存放一个变量的地址指针);目的操作数:必须是16位寄存器,常用SI寄存器,但不能用段寄存器。68例设:DS=1200H,(12450H)=0F346H,(12452H)=0A90H。执行指令LDSSI,[450H]后,结果如何?解:SI=0F346H,DS=0A90H§3-38086的指令系统

——数据传送指令

69§3-38086的指令系统

——数据传送指令

⑶LES将双字指针送到寄存器和ES指令(LoadPointerusingES)指令格式:LES 目的,源指令功能:源操作数指定的存储单元中的4字节地址指针→一对目的寄存器。其中:前两个字节(偏移地址)→指定的目的寄存器;(常用DI寄存器)后两个字节(段地址)→ES寄存器。例设:DS=0100H,BX=0020H,(01020H)=0300H,(01022H)=0500H。执行指令LESDI,[BX]后,结果如何?解:DI=0300H,ES=0500H704.标志传送指令(FlagTransfers):§3-38086的指令系统

——数据传送指令

读取标志指令:LAHF(5、3、0为任意值)--标志寄存器低8位→AH设置标志指令:SAHF--标志寄存器低8位←AH把标志寄存器的内容压入堆栈:PUSHF从堆栈弹出到标志寄存器:POPF1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D0参见“处理器控制命令”71§3-38086的指令系统

——数据传送指令

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

AH寄存器的位7、6、4、2和0。注意:◎位5、3、1的内容未定义,是任意值。◎执行这条指令后,标志位本身并不受影响。1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D072§3-38086的指令系统

——数据传送指令

⑵SAHFAH送标志寄存器(StoreAHintoFlags)

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

→标志寄存器。注意:◎位5、3、1的内容未定义,是任意值。◎执行这条指令后,高位标志并不受影响。

1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D073§3-38086的指令系统

——数据传送指令

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

堆栈;修改堆栈指针,使SPSP-2;指令执行后对标志位无影响。⑷POPF标志出栈指令(PopFlagoffStack)指令格式:POPF指令功能:堆栈指针SP所指的一个字

标志寄存器PSW;修改堆栈指针,使SPSP+2。注意:▲要成对使用PUSHF和POPF,可对标志寄存器进行保存和恢复。▲常用在:过程(子程序)调用,中断服务程序,对主程序的状态(即标志位)进行保护。▲也可用来改变追踪标志TF。在8086指令系统中没有直接改变TF(D8位)的指令。74§3-38086的指令系统

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

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

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

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

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

——算术运算指令算术运算指令的种类:加法ADDADCINCAAADAA加法带进位的加法增量加法的ASCII调整加法的十进制调整减法SUBSBBDECNEGCMPAASDAS减法带借位的减法减量取补比较减法的ASCII调整减法的十进制调整乘法MULIMULAAM无符号数乘法整数乘法乘法的ASCII调整除法DIVIDIVAADCBWCWD无符号数除法整数除法除法的ASCII调整把字节转换成字把字转换成双字781.加法指令(Addition)⑴ADD加法指令(Addition)指令格式:ADD目的,源指令功能:目的源十目的⑵ADC带进位的加法指令(AdditionwithCarry)指令格式:ADC目的,源指令功能:目的源十目的十CF操作数的要求:(包括上两条指令)源操作数:可以是寄存器、存储器、立即数;目的操作数:只能用寄存器、存储单元。注意:★源、目的操作数不能同时为存储器,且类型必须一致,即都是字节或字;★这两条指令影响的标志位为:CF、OF、PF、SF、ZF和AF。§3-38086的指令系统

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

——算术运算指令

例两种加法指令的实例ADDAL,18H ;ALAL十18HADCBL,CL ;BLBL十CL十CFADCAX,DX ;AXAX十DX十CFADDAL,COST[BX];AL内容和地址=DS:(COST+BX)的存储字节相加,结果送AL.ADDCOST[BX],BL ;将BL与物理地址=DS:(COST十BX)的存储字节相加,结果留在该存储单元中.例用加法指令对两个8位16进制数5EH和3CH求和,并分析加法运算指令执行后对标志位的影响。解:MOVAL,5EH ;AL=5EH(94)MOVBL,3CH ;BL=3CH(60)ADDAL,BL ;结果AL=9AH80§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标志。81②两个加数都当成带符号数时,符号标志SF和溢出标志OF很重要,而进位标志CF没有意义。带符号数能表示的范围-128~+127,而本例中,两个正数94和60相加,其和为154,由于154超过了范围,即产生了溢出,OF=1§3-38086的指令系统

——算术运算指令82进位标志CF(CarryFlag)当加减运算结果的最高有效位(D15或D7)有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0。无符号数?有符号数?

针对无符号整数,判断加减结果是否超出表达范围。N个二进制位表达无符号整数的范围:0~2N-18位:0~+25516位:0~+6553532位:0~+232-1§3-38086的指令系统

——算术运算指令83进位标志CF:举例8位二进制数相加: 00111010+01111100=10110110十六进制表达:3A+7C=B6转换成十进制数:58+124=182没有产生进位:CF=08位二进制数相加:

10101010+01111100=[1]00100110十六进制表达:AA+7C=[1]26转换成十进制数:170+124=294=256+38产生进位:CF=10<182<255进位1表达256§3-38086的指令系统

——算术运算指令84溢出标志OF(OverflowFlag)有符号数加减结果有溢出,则OF=1;否则OF=0。针对有符号整数,判断加减结果是否超出表达范围。N个二进制位表达有符号整数的范围:-2N-1~2N-1-18位:-128~+12716位:-32768~+3276732位:-231~+231-1§3-38086的指令系统

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

——算术运算指令溢出标志OF:举例8位二进制数相加: 00111010+01111100=10110110十六进制表达:3A+7C=B6转换成十进制数:58+124=182超出范围:OF=18位二进制数相加:

10101010+01111100=[1]00100110十六进制表达:AA+7C=[1]26转换成十进制数:-86+124=38没有超出范围:OF=0182>127补码AAH表达-8686§3-38086的指令系统

——算术运算指令进位和溢出的区别进位标志反映无符号整数运算结果是否超出范围有进位,加上进位或借位后运算结果仍然正确溢出标志反映有符号整数运算结果是否超出范围有溢出,运算结果已经不正确处理器按照无符号整数求得结果在设置进位标志CF的同时,根据是否超出有符号整数的范围设置溢出标志OF。应该利用哪个标志,由程序员决定!操作数是无符号数,关心进位操作数是有符号数,注意溢出87§3-38086的指令系统

——算术运算指令溢出标志的判断处理器硬件判断规则最高位和次高位同时有进位或同时无进位,无溢出;最高位和次高位进位状态不同,有溢出人工判断的简单规则只有当两个相同符号数相加(含两个不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,不会产生溢出

00111010+01111100

10110110正数正数负数最高位次高位88§3-38086的指令系统

——算术运算指令奇偶标志PF(ParityFlag)当运算结果最低8位中“1”的个数为零或偶数时,PF=1;否则PF=0举例8位二进制数相加:

00111010+01111100=10110110

“1”的个数为5个:PF=08位二进制数相加:

10000100+01111100=[1]00000000

“1”的个数为0个:PF=1结果进位仅最低8位“1”的个数89§3-38086的指令系统

——算术运算指令零标志ZF(ZeroFlag)运算结果为0,则ZF=1,否则ZF=0结果是0,ZF标志不是0!举例8位二进制数相加:

00111010+01111100=10110110

结果不是0,ZF=08位二进制数相加:

10000100+01111100=[1]00000000

结果是0,ZF=1结果进位90⑶INC增量指令(Increment)指令格式:INC目的指令功能:目的目的十1操作数的要求:

通用寄存器、内存。注意:▲这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改;§3-38086的指令系统

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

——算术运算指令▲指令执行后影响AF、OF、PF、SF和ZF,但不影响进位标志CF。▲该指令只有一个操作数时,如果要使内存单元的内容增1,程序中必须说明该存储单元是字还是字节。INC指令的两个应用例子:例INCBL ;BL寄存器中内容增1

INCCX ;CX寄存器中内容增1例

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

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

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

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

否则:将AL寄存器的高4位清0。例若AL=BCD9,BL=BCD5,求两数之和。解:设AH=0,则运算过程如下:§3-38086的指令系统

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

——算术运算指令

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

——算术运算指令例求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。96§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。97§3-38086的指令系统

——算术运算指令例若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。98§3-38086的指令系统

——算术运算指令例若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或

温馨提示

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

评论

0/150

提交评论