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

下载本文档

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

文档简介

第二章8086/8088寻址方式和指令系统

本章主要掌握的要点:

1.14个16位寄存器,8个8位寄存器2.8086/8088七种寻址方式3.8086/8088各种指令汇编语言与CPU关系密切。从汇编语言程序设计的角度看,8086/8088、80186和实方式下的80286没有多大差异,而且Intel的80X86指令系统向上兼容。本章介绍8086/8088寻址方式和指令系统。

一、8086/8088寄存器组

AHAL

AXBHBLBX

数据寄存器

通用寄存器

SP

堆栈指针指针寄存器

BP

基址指针

SI

源地址变址寄存器

DI

目的地址

CHCLDHDLCXDX

IP

指令指针

控制寄存器

FLAG

标志寄存器

CS

代码段

DS

数据段段寄存器

SS

堆栈段

ES

附加段1、通用寄存器数据寄存器,指针寄存器和变址寄存器统称为通用寄存器。这些寄存器除了各自专门用途外,它们均可用于传送和暂存数据,可以保存算术逻辑运算中的操作数和运算结果。(1)数据寄存器数据寄存器主要用来保存操作数或运算结果等信息,它们的存在节省了为存取操作数所需占用总线和访问存储器的时间。(2)变址和指针寄存器变址和指针寄存器主要用于存放某个存储单元地址的偏移,或某组存储单元开始地址的偏移,即作为存储器(短)指针使用。作为通用寄存器,它们也可以保存16位算术逻辑运算中的操作数和运算结果,有时运算结果就是需要的存储单元地址的偏移。

2、段寄存器

8086/8088CPU依赖其内部的四个段寄存器实现寻址1M字节物理地址空间。8086/8088把1M字节地址空间分成若干逻辑段,当前使用的段值存放在段寄存器中。由于8086/8088有这四个段寄存器,所以有四个当前使用段可直接存取,这四个当前段分别称为代码段,数据段,堆栈段和附加段。

3、控制寄存器

(1)指令指针

8086/8088CPU中的指令指针IP也是16位的。指令指针IP给出接着要执行的指令在代码段中的偏移。(2)标志寄存器

8086/8088CPU中有一个16位的标志寄存器,包含了9个标志,主要用于反映处理器的状态和运算结果的某些特征。各标志在标志寄存器中的位置如下所示。1514131211109876543210ODITSZAPCFFFFFFFFF①运算结果标志

(1)进位标志CF主要用于反映运算是否产生进位或借位。

(2)零标志ZF用于反映运算结果是否为0。如果运算结果为0,则ZF被置1,否则置0。(3)符号标志SF用于反映运算结果的符号位。SF与运算结果的最高位相同,如果运算结果的最高位为1,则SF被置1,否则SF被置0。(4)溢出标志OF

用于反映有符号数加减运算是否引出溢出。如运算结果超出了8位或16位有符号数的表示范围,即在字节运算时大于127或小于-128,在字运算时大于32767或小于-32768,称为溢出。如溢出,则OF被置1,否则被置0。

(5)奇偶标志PF用于反映运算结果中“1”的个数。如果“1”的个数为偶数,则OF被置1,否则OF被清0。

(6)辅助进位标志AF在字节操作时,如发生低半字节向高半字节进位或借位;在字操作时,如发生低字节向高字节进位或借位,则辅助进位标志AF被置1,否则AF被清0。②状态控制标志(1)方向标志DF方向标志决定着串操作指令执行时,有关指针寄存器调整方向。当DF为1时,串操作指令按减方式改变有关的存储器指针值,当DF为0时,串操作指令按加方式改变有关的存储器指针值。

(2)中断允许标志IF中断允许标志决定着CPU是否响应外部可屏蔽中断请求,当IF为1时,CPU能够响应外部的可屏蔽中断请求;当IF为0时,则不响应外部的可屏蔽中断请求。(3)追踪标志TF当TF被置1后,CPU进入单步方式。所谓单步方式是指在一条指令执行后,产生一个单步中断。主要用于程序的调试。

二、存储器分段和地址的形成1、存储单元的地址和内容

在存储器里以字节为单位存储信息。为了正确地存放或取得信息,每一个字节单元给以一个存储器的地址。地址从0开始编号,顺序地每次加1。在机器里,地址也是用二进制数来表示的。它是无符号整数,书写格式为十六进制数。那么16位二进制数可以表示多少个字节单元的地址呢?应该是216个所以表示的地址范围应该是0~65535。65536个字节单元的存储容量就是64K,

其地址编号的范围用十六进制数表示为:0~FFFFH。如下所示:0000,0001,0002,0003,……0009,000A,000B,000C,000D,000E,000F,0010,0011,……,0019,001A,001B,001C,001D,001E,001F,0020,0021,……,,002F,……FFE0,FFE1,……,,FFEE,FFEF,FFF0,FFF1,……,,FFFE,FFFF。一个存储单元中存放的信息称为该存储单元的内容。如下图表示了存储器里存放信息的情况。可以看出:4号字节单元中存放的信息为34H表示为:(0004H)=34H但是机器字长是16位,大部分数据都是以字为单元表示的。字单元的地址采用它的低地址来表示的。

0000H

0001H

66H

0002H如左图存储器4号字单元的内容为1234H,45H0003H表示为:(0004)=1234H34H0004H上述原则称为“高高低低”原则。12H0005H四个连续的字节单元就构成了一个双字单元,1EH0006H地址为0002H的双字单元中存放的内容是:…

12344566H12H1234H

(0004H)=1234H1AH1235H

(1234H)=1A12H

1236H

所以:((0004))=1A12H

1237H

2.存储器地址的分段及物理地址的形成前面已经提到16位字长的机器,可以访问的最大存储空间为64K字节。而8086/8088CPU有20根地址线,可直接寻址的物理地址空间为1M字节。所以,要访问1M字节空间的存储器必须有20位地址。

用16进制数表示1M字节的地址范围应为00000~FFFFF。那么,在16位字长的机器里,用什么办法来提供20位地址呢?

采用存储器地址分段的办法。程序员在编制程序时要把存储器划分成段,每个段的大小可达64K,这样段内地址可以用16位表示。

段与段之间可以相连,也可以不相连,还可以部分重叠。但IBMPC机对段的起始地址有所限制,段不能起始于任意地址,而必须从任一小段的首地址开始。机器规定:从0地址开始,每16个字节为一小段(16的倍数),下面列出了存储器最低地址区的三个小段的地址区间,每行为一小段。

00000,00001,00002,…,0000E,0000F;00010,00011,00012,…,0001E,0001F;00020,00021,00022,…,0002E,0002F;

…………第一列就是每个小段的首地址。其特征是:在16进制表示的地址中,最低为0(即20位地址的低4位为0)。在1M字节的地址空间里,共有64K个小段首地址,可表示如下:

00000H00010H……41230H41240H……FFFE0HFFFF0H在1M字节的存储器里,每一个存储单元都有一个唯一的20位地址。称为:

该存储单元的物理地址。

CPU访问存储器时,必须先确定所要访问的存储单元的物理地址才能取得(或存入)该单元中的内容。

要访问的某一个存储单元总是属于某个段。把存储单元的地址与所在段的起始地址的差称为段内偏移,简称为偏移。在一个段内,通过偏移可指定要访问的存储单元,或者说要访问的存储单元可由偏移来指定。在整个1M地址空间中,存储单元的物理地址等于段起始地址加上偏移。

存储单元的逻辑地址由:段值和偏移两部分组成用如下形式表示:段值:偏移根据逻辑地址可方便地得到存储单元的物理地址,公式如下:物理地址=段值×16+偏移。所以20位物理地址由:16位段地址和16位偏移地址组成。段地址是指每一段的起始地址,由于它必须是小段的首地址,所以其低4位一定是0。如下左图物理地址产生的示意图:

19

0段值0000

15

0偏移

+

19

0物理地址例如:用16进制表示的逻辑地址1000:3456所对应的存储单元的物理地址为:

物理地址=10000+3456=13456H

存储器

10020H

12330H

2325H

15H

12345H由于段可以重叠,所以一个物理地址可用多个逻辑地址表示。如:上图其中:存储单元的物理地址是12345H,标出的:两个重叠段的段值分别是:1002H和1233H,在对应段内的偏移分别是2325H和0015H。采用段值和偏移构成逻辑地址后,段值由段寄存器给出,偏移可由指令指针IP、堆栈指针SP和其他可作为存储器指针使用的寄存器(SI、DI、BX和BP)给出,偏移还可直接用16位数给出。

指令中不使用物理地址,而是使用逻辑地址,由总线接口单元BIU按需要根据段值和偏移自动形成20位物理址。3、段寄存器的引用由于8086/8088CPU有四个段寄存器,可保存四个段值。所以可同时使用四个段值,但这四个段有所分工。在取指令的时候,自动引用代码段寄存器CS,再加上由IP所给出的16位偏移,得到要取指令的物理地址。

当涉及到一个堆栈操作时,则自动引用堆栈寄存器SS,再加上由SP所给出的16位偏移,得到堆栈操作所需要的物理地址。当偏移涉及BP寄存器时,缺省引用段寄存器SS。

在存取一个普通存储器操作数时,则自动选择数据寄存器DS或附加段寄存器ES,再加上16位偏移,得到存储器操作数的物理地址。

在不改变段寄存器值的情况下,寻址的最大范围是64K字节。若某个程序使用的总的存储长度(包括代码、堆栈和数据区)不超过64K字节,则整个程序可以合用一个64K字节的段。假如某个程序的数据区长度超过64K字节,那么就要在两个或多个数据段中存取数据

三、.8086/8088的寻址方式计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集提供给用户使用,这组指令集就称为计算机的指令系统。计算机中的指令由操作码字段和操作数字段两部分组成。指令的操作码字段在机器里的表示比较简单,只需对每一种操作指定确定的二进制代码就可以了。指令的操作数字段的情况就比较复杂,如果操作数存放在寄存器中,则由于寄存器的数量较少,因而需要指定的操作数地址的位数就较少。但如果操作数存放在存储器里,那么一个存储单元的地址就需要20位,怎样设法使它在指令的操作数字段的表示中减少位数呢?前面我们已经讲了,计算机只能识别二进制代码,所以机器指令是由二进制代码组成的。为了便于人们使用而采用汇编语言来编写程序。汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址。它与机器指令一一对应的。寻址方式:表示指令中用于说明操作数所在的地址的方法8086/8088有七种基本的寻址方式,下面介绍这七种寻址方式:

1、立即寻址方式操作数就包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段。这种操作数称为立即数。立即数可以是8位的可以是16位的。如果立即数是16位的按‘高高低低的原则。例如:指令:MOVAX,1234H的存储和执行情况如下图:AHAL存储器AX1234…OP34指令代码段12…

图中指令存放在代码段中,OP表示该指令的操作码部分再例如:

MOVAL,5

则指令执行后,(AL)=05H

MOVBX,3064H则指令执行后,(BX)=3064H2、寄存器寻址方式操作数在CPU内部的寄存器中,指令指定寄存器号。对于16位操作数数,寄存器可以是:AX、BX、CX、DX、SI、DI、SP和BP等;对于8位操作数,寄存器可以是:AL、AH、BL、BH、CL、CH、DL、DH。这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度。例如:MOVAX,BX如指令执行前(AX)=3064H,(BX)=1234H;则指令执行后,(AX)=1234H,(BX)保持不变例如:MOVSI,AXMOVAL,DH3、直接寻址方式操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)。操作数一般存放在数据段,所以操作数的地址由DS加上指令中直接给出的16位偏移得到。如果采用段超越前缀,则操作数也可含在数据段外的其他段中。

存储器…DS2000OP例如;+806666代码段MOVAX,[8066]AHAL2806680如(DS)=2000H,AX1234…则执行结果如左图为:20000(AX)=1234H…(物理地址=200000+28066348066=28066H)

12数据段…在汇编语言指令中,可以用符号地址代替数值地址,如:

MOVAX,VALUE

此时VALUE为存放操作数单元的符号地址。如写成:MOVAX,[VALUE]

也是可以的,两者是等效的。如VALUE在附加段中,则应指定段超越前缀如下:MOVAX,ES:VALUE或MOVAX,ES:[VALUE]直接寻址方式常用于处理单个存储器变量的情况。它可实现在64K字节的段内寻找操作数。直接寻址的操作数通常是程序使用的变量。注意立即寻址和直接寻址书写表示方法上的不同,直接寻址的地址要放在方括号中。在源程序中,往往用变量名表示。4、寄存器间接寻址方式操作数在存储器中,操作数有效地址在SI、DI、BX、BP这四个寄存器之一中。在一般情况下,如果有效地址在SI、DI和BX中,则以DS段寄存器之内容为段值。如果有效地址在BP中,则以SS段寄存器之内容为段值。

存储器

DS5000…例如:MOVAX,[SI]

+SI1234OP代码段如果(DS)=5000H

51234…(SI)=1234H

AHAL50000则物理地址=500000+AX6789…1234=51234H

5123489数据段

执行该指令后,

67

(AX)=6789H

指令中也可指定段超越前缀来取得其他段中的数据如:MOVAX,ES:[BX];引用的段寄存器是ES

MOV[SI],AX;目的操作数寄存器间接寻址MOV[BP],CX;引用的段寄存器是BPMOVSI,AX;目的操作数寄存器寻址。

5、寄存器相对寻址方式操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器的(SI、DI)内容加上指令中给定的8位或16位位移量之和。即:(BX)8位位移量EA(有效地址)=(BP)+(SI)16位位移量(DI)

在一般情况下,如果SI、DI或BX之内容作为有效地址的一部分,那么引用的段寄存器是DS;如果BP之内容作为有效地址的一部分,那么引用的段寄存器是SS。物理地址=16d×(DS)+(BX)+8

或(SI)或16位位移量或(DI)物理地址=16d×(SS)+(BP)+8位位移量或16位位移量在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如位移量是8位,则被带符号扩展成16位。例如:MOVAX,[DI+1223H]假设,(DS)=5000H,(DI)=3678H则

物理地址=50000+3678+1223=5489BH假设该字存储单元的内容如下图,则(AX)=55AAH

存储器DS5000…DI3678OP+122323代码段5489B12AHAL…AX55AA……1223AA数据段55…下面指令中,源操作数采用寄存器相对寻址,引用的段寄存器是SS:MOVBX,[BP-4]下面指令中,目的操作数采用寄存器相对寻址,引用的段寄存器是ES:MOVES:[BX+5],AL

指令:MOVAX,[SI+3]与MOVAX,3[SI]是等价的

50000

5489B536786、基址加变址寻址方式

操作数在存储器中,操作数的有效地址由:基址寄存器之一的内容与变址寄存器之一的内容相加

在一般情况下,如果BP之内容作为有效地址的一部分,则以SS之内容为段值,否则以DS之内容为段值。存储器例如:MOVAX,[BX][DI]DS2100…如(DS)=2100H,BX0158(BX)=0158H,AHALDI10A5…(DI)=10A5H

AX1234221FD…则EA=0158+10A5=11FD数据段34物理地址=21000+11FD=221FDH12指令情况如左图执行结果:

(AX)=1234H(BX)(BP)即:EA=+(SI)(DI)+

2100021158221FD下面指令中,目的操作数采用基址加变址寻址,引用的段寄存器是DS:

MOVDS:[BP+SI],AL下面指令中,源操作数采用基址加变址寻址,

引用的段寄存器ES:MOVAX,ES:[BX+SI]这种寻址方式适用于数组或表格处理。用基址寄存器存放数组首地址,而用变址寄存器来定位数组中的各元素,或反之。由于两个寄存器都可改变,所以能更加灵活地访问数组或表格中的元素。下面的两种表示方法是等价的:

MOVAX,[BX+DI]MOVAX,[DI][BX]

7、相对基址加变址寻址方式操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容及指令中给定的8位或16位位移量相加得到。在一般情况下,如果BP之内容作为有效地址的一部分,则以SS段寄存器之内容为段值,否则以DS段寄存器之内容为段值。在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如果位移量是8位,那么被带符号扩展成16位。当所得的有效地址超过FFFFH时,就取其64K的模。即:EA=(BX)(BP)+(SI)(DI)+8位16位位移量例如:MOVAX,[BX+DI-2]假设,(DS)=5000H,(BX)=1223H,(DI)=54H(51275)=54H(51276)=76H那么,存取的物理存储单元是多少呢?物理地址=50000+1223+0054+FFFE=51275H在执行该指令后,(AX)=7654H。相对基址加变址这种寻址方式的表示方法多种多样,下面四种表示方法均是等价的:MOVAX,[BX+DI+1234H],MOVAX,1234H[BX][DI]MOVAX,1234H[BX+DI],MOVAX,1234H[DI][BX]1、现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H(20103)=78H,(21200)=2AH,(21201)=4CH(21202)=B7H,(21203)=65H试说明下列各条指令执行完后AX寄存器的内容MOVAX,1200HMOVAX,BXMOVAX,[1200H]MOVAX,[BX]MOVAX,1100[BX]MOVAX,[BX][SI]MOVAX,1100[BX][SI]2、假设(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H(BP)=0010H,数据段中变量名VAL的偏移地址值为0050H,试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少?MOVAX,0ABHMOVAX,BXMOVAX,[100H]MOVAX,VALMOVAX,[BX]MOVAX,ES:[BX]MOVAX,[BP]MOVAX,[SI]MOVAX,[BX+10]MOVAX,VAL[BX]MOVAX,[BX][SI]MOVAX,VAL[BX][SI]四、8086/8088指令系统8086/8088的指令系统丰富,而且指令的功能也强。大多数指令既能处理字数据,又能处理字节数据;算术运算和逻辑运算不局限于累加器,存储器操作数也可直接参加算术逻辑运算。8086/8088的指令系统可分为如下六个功能组:数据传送算术运算逻辑运算串操作程序控制处理器控制汇编语言中指令语句的一般格式。指令语句可由四部分组成,一般格式如下:[标号:]指令助记符[操作数1[,操作数2]][;注释]指令是否带有操作数,完全取决于指令本身标号的使用取决于程序的需要,标号只被汇编程序识别,它与指令本身无关。

(一).数据传送指令数据传送指令组又可分为:传送指令,交换指令,地址传送指令,堆栈操作指令,标志传送指令。查表指令,输入输出指令在有关章节介绍。除了SAHF和POPF指令外,这组指令对各标志没有影响。1、传送指令其格式如下:MOVDST,SRC源操作数可以是累加器、寄存器、存储单元以及立即数,而目的操作数可以是累加器、寄存器和存储单元。传送不改变源操作数。数据传送指令能实现下列传送功能:(1)CPU内部寄存器之间的数据传送。例如:MOVAH,ALMOVDL,DHMOVBP,SPMOVAX,CS注意:源和目的操作数不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP既不能作为源,也不能作为目的。注意,这种例外永远存在。(2)

立即数送至通用寄存器或存储单元(各种存储器寻址方式)。例如:MOVAL,3MOVSI,-5MOVVARB,-1;VARB是变量名,代表一个存储单元MOVVARW,3456H;VARW是一个字变量MOV[SI],6543H注意:立即数不能直接传送到段寄存器,立即数永远不能作为目的操作。(3)寄存器与存储器间的数据传送。例如:MOVAX,VARW;VARW是一个字变量,存储器操作为直接寻址MOVBH,[DI];存储器操作数为寄存器间接寻址MOVDI,ES:[SI+3];存储器操作数为相对变址寻址,使用段超越前缀MOVVARB,DL;VARB是一个字节变量MOVDS:[BP],DL;使用段超越前缀MOVVARW,DS;VARW是一个字变量MOVES,VARW

注意:源操作数和目的操作数类型要一致。即同时为字节或字,不能一个字节,另一个是字。除了串操作指令外,源操作数和目的操作数不能同时是存储器操作数。如果要在两个存储单元间传送数据,那么可利用通用寄存器过渡的方法进行,例如:把字变量VARW1的内容送到字变量VARW2MOVAX,VARW1MOVVARW2,AX这种利用通用寄存器过渡的方法,也适用于段寄存器间的数据传送。例如:MOVAX,CS;把CS的内容送到DSMOVDS,AS例如:MOVAL,‘D’立即数(字符D的ASCII码)送到AL寄存器.MOVBX,OFFSETTABLE把TABLE的偏移地址(不是内容)送到BX寄存器.其中OFFSET为属性操作符.此指令不影响标志位2、交换指令利用交换指令可方便地实现通用寄存器与通用寄存器或存储单元间的数据交换,交换指令的格式如下:XCHGOPRD1,OPRD2此指令把操作数OPRD1的内容与操作数OPRD2的内容交换。操作数同时是字节或字。例如:XCHGAL,AHXCHGSI,BXOPRD1和OPRD2可以是通用寄存器和存储单元。但不包括段寄存器,也不能同时是存储单元,还不能有立即数,可采用各种存储器寻址方式来指定存储单元。例如:XCHGBX,[BP+SI]如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246)=4154H物理地址=2F000+0200+0046=2F246H指令执行后:(BX)=4154H(2F246H)=6F30H

此指令不影响标志位3、地址传送指令8086/8088有如下三条地址传送指令。(1)指令LEA(LoadEffectiveAddress)指令LEA称为传送有效地址指令,其格式如下:LEAREG,OPRD该指令把操作数OPRD的有效地址传送到操作数REG。操作数OPRD必须是一个存储器操作数,操作数REG必须是一个16位的通用寄存器。例如:LEAAX,BUFFER;BUFFER是变量名LEADS,[BS+S]LEASI,[BP+DI+4]例如:LEABX,[BX+SI+0F62H]如指令执行前(BX)=0400H,(SI)=003CH指令执行后(BX)=0040+003C+0F62=139EH(2)指令LDS(LoadpointerintoDS)段值和段内偏移构成32位的地址指针。该指令传送32位地址指针,其格式如下:

LDSREG,OPRD执行的操作:(REG)(SRC)(DS)(SRC+2)该指令把操作数OPRD中所含的一个32位地址指针的段值部分送到数据段寄存器DS,把偏移部分送到指令给出的通用寄存器REG。操作数OPRD必须是一个32位的存储器操作数,操作数REG可以是一个16位的通用寄存器,但实际使用的往往是变址寄存器或指针寄存器。LDSSI,POINTER;POINTER是一个双字变量

假设双字变量POINTER包含的32位地址指针的段值为5678H,偏移为1234H,那么在执行指令后:(DS)=5678H,(SI)=1234H32位地址指针的偏移部分存储在双字变量的低地址字中,段值部分存储在高地址字中。例如:LDSSI,[10H]如指令执行前:(DS)=C000H,(C0010H)=0180,(C0012H)=2000H指令执行后:(SI)=0180H,(DS)=2000H(3)指令LES(LoadpointerintoES)LES指令也传送32位地址指针,其格式如下:LESREG,OPRD该指令把操作数OPRD中所含的32位地址指针的段值部分送到附加段寄存器ES,把偏移部分送到指令给出的通用寄存器REG。

执行的操作;(REG)(SRC)(ES)(SRC+2)例如:LESDI,[BX]如指令执行前:(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H指令执行后:(DI)=05AEH,(ES)=4000H以上三条指令LEA、LDS、LES不影响标志位例如:如TABLE为数据段中0032单元的符号名,其中存放的内容为1234H,试问以下两条指令有什么区别?指令执行完后AX寄存器的内容是什么?MOVAX,TABLELEAAX,TABLEMOVAX,OFFSETTABLE例如:一个有16个字的的数据区,它的起始地址为:70A0:DDF6,请写出这个数据区首末字单元的物理地址首地址为:70A00+DDF6=7E7F6H末地址为:7E7F6+1E=7E814H

…7E7F6H7E814H4、堆栈操作指令在8086/8088系统中,堆栈是一段RAM区域。称为栈底的一端地址较大,称为栈顶的一端地址较小。(高地址)(低地址)堆栈的段值在堆栈段寄存器SS中,堆栈指针寄存器SP始终指向栈顶。堆栈是以“后进先出”方式工作的一个存储区。堆栈的存取必须以字为单位。堆栈操作指令分为两种:(1)进栈指令PUSH

格式如下;PUSHSRC执行的操作:(SP)(SP)-2该指令把源操作数SRC压入堆栈。它先把堆栈指针寄存器SP的值减2,然后把源操作数SRC送入由SP所指的栈顶。源操作数SRC可以是通用寄存器和段寄存器,也可以是字存储单元。例如:PUSHAX

假设AX=2107H

指令执行前指令执行后堆栈段堆栈段低地址低地址

(SP)0721进栈方向(SP)高地址高地址(2)出栈指令POP格式如下;POPDST执行的操作:(SP)(SP)+2POPDST该指令从栈顶弹出一个字数据到目的操作数DST。它先把堆栈指针寄存器SP所指的字数据送至目的的操作数DST,然后SP值加2,DST可以是通用寄存器和段寄存器(但CS例外),也可以是字存储单元。

指令执行前指令执行后堆栈段堆栈段低地址低地址接前面的例子(SP)0707如左图:2121例如:POPAX(SP)执行后:出栈方向(AX)=2107H高地址高地址注意:以上两条指令PHSH和POP只能作字操作。它们可以使用除立即数以外的其他寻址方式。但POP指令不允许用CS寄存器。此两条指令不影响标志位下面的程序段说明堆栈的一种用途,临时保存寄存器的内容,必要时再恢复其原始内容。例如:PUSHAX;保护AXPUSHBX……;其间程序用到AX和BX寄存器POPBX;使DS的内容与CS的内容相同POPAX;恢复AX再例如:

PUSHSIPOPSIPUSHDSPOPESPUSHVARW;VARW是字变量POPVARW;VARW是字变量PUSH[SI]POP[SI]

通过上面讲过的指令,数据交换有三种方式;传送指令、交换指令、堆栈指令例如:将寄存器AX与SI的内容交换用MOV指令,利用通用寄存器过渡的方法 MOVBX,AX MOVAX,SI MOVSI,BX用交换指令XCHG XCHGAX,SI用堆栈指令 PUSHAX PUSHSI … POPAX POPSI例:假设(SS)=2250H,(SP)=0140H,如果在堆栈中存入5个数据,则栈顶的物理地址为多少?如果又从堆栈中取出3个数据,则栈顶的物理地址是多少?未存入数据之前物理地址=22500+0140=22640H存入5个数据栈顶的物理地址为:22640-0A=22636H取出3个数据栈顶的物理地址为:22636+6=2263CH5、标志操作指令

(1)标志传送指令标志传送指令属于数据传送指令组。①指令LAHF(LoadAHwithFlags)

指令LAHF采用固定寻址方式,指令格式如下:LAHF该条指令把标志寄存器的低8位(包括SF、ZF、AF、PF和CF)传送到寄存器AH的指定位,如下图所示70

AHFLAGOFDFIFTFSFZFAFPFCF这条指令本身不影响这些标志和其他标志。②指令SAHF(StoreAHintoFlags)指令SAHF采用固定寻址方式,其格式如下:SAHF该条指令与指令LAHF刚好相反,把寄存器AH的指定位送至标志寄存器低8位的SF、ZF、AF、PF和CF标志位。因而这些标志的内容就要受到影响,并取决于AH中相应位的状态。但这条指令不影响溢出标志OF、方向标志DF、中断允许标志IF和追踪标志TF,也即不影响标志寄存器的高位字节。例如:MOVAH,0C1HSAHF;CF=1,PF=0,AF=0,ZF=1,SF=1③指令PUSHF

指令PUSHF的格式如下:PUSHF该条指令把标志寄存器的内容压入堆栈,即先把堆栈指针寄存器SP的值减2,然后把标志寄存器的内容送入由SP所指的栈顶。④指令POPF指令POPF的格式如下:POPF该条指令把当前堆栈顶的一个字传送到标志寄存器,同时相应地修改堆栈指针,即把堆栈指针寄存器SP的值加2。这条指令和PUSHF指令一起可以保存和恢复标志寄存器的内容,即保存和恢复各标志的值。另外,这两条指令也可以用来改变追踪标志TF。为了改变TF标志,可先用PUSHF指令将标志压入堆栈,然后设法改变栈顶字单元中的第8位(把整个标志寄存器看成是一个字),再用POPF指令把该字弹回到标起寄存器,这样其余的标志不受影响,而只有TF标志按需要改变了。(2)标志位操作指令

标志位操作指令仅对指令规定的标志产生指令规定的影响,对其他标志没有影响。①清进位标志指令CLC(ClearCarryflag)清进位标志指令的格式如下:CLC该指令使进位标志为0。②置进位标志指令STC(SeTCarryflag)

置进位标志指令的格式如下:STC该指令使进位标志为1。③进位标志取反指令CMC(CoMplementcarryflag)进位标志取反指令的格式如下:CMC该指令使进位标志取反。如CF为1,则使CF为0;如CF为0,则CF为1④清方向标志CLD(ClearDirectionflag)

清方向标志指令的格式如下:CLD该条指令使方向标志DF为0。从而在执行串操作指令时,使地址按递增方式变化。⑤置方向标志STD(SeTDirectionflag)置方向标志指令的格式如下:STD该条指令使方向标志DF为1。从而在执行串操作指令时,使地址按递减方式变化。⑥清中断允许标志CLI(ClearInterruptenableflag)清中断允许标志指令的格式如下:CLI该条指令使中断允许标志IF为0,于是CPU就不响应来自外部装置的可屏蔽中断。但对不可屏蔽中断和内部中断都没有影响。⑦置中断允许标志STI(SeTInterruptenableflag)置中断允许标志指令的格式如下:STI该条指令使中断允许标志IF为1,则CPU可以响应可屏蔽中断。(二)加减运算指令1.加法指令ADD格式如下:ADDOPRD1,OPRD2执行的操作:(OPRD1)(OPRD1)+(OPRD2)例如:MOVAX,7896H;AX=7890H,即AH=78H,AL=96H;各标志位保持不变ADDAL,AH;AL=0EH,AH=78H,即AX=780EHCF=1,ZF=0,SF=0,OF=0,AF=0,AF=0,PF=0例如:ADDDX,0F0F0H执行前(DX)=4652H执行后(DX)=3742HZF=0,SF=0,CF=1,OF=0例如:ADDAX,4321执行前(AX)=62A0H执行后(AX)=A5C1HSF=1,ZF=0,CF=0,OF=1从上面例子可看出:加法指令影响标志位.OF位则根据操作数的符号及其变化情况来设置:若两个操作数的符号相同而结果的符号与之相反时OF=1,否则OF=0CF位可以用来表示无符号数的溢出.由于无符号数的最高有效位只有数值意义而无符号意义,所以从该位产生的进位应该是结果的实际进位值,但在有限数的范围内就说明了结果的溢出.2、带进位加指令ADC(ADdwithCarry)

带进位加指令的格式如下:ADCOPRD1,OPRD2

OPRD1OPRD1+OPRD2+CF例如:下列指令序列执行两个双精度的加法。设目的操作数放在DX和AX寄存器中,其中DX存放高位字。源操作数存放在BX、CX中,其中BX存放高位字。如指令执行前:(DX)=0002H,(AX)=0F365H(BX)=0005H,(CX)=0E024H指令序列为:

ADDAX,CXADCDX,BX执行第一条指令后:(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0执行第二条指令后:(DX)=0008H,SF=0,ZF=0,CF=0,OF=0则该指令序列执行完后:(DX)=0008H,(AX)=D389H从上面的例子可以看出:为实现双精度数加法,必须用两条指令分别完成低位字和高位字的加法,而且在高位字相加时,应该使用ADC指令以便把前一条ADD指令作低位字加法所产生的进位值加入高位字之内。另外,带符号的双精度数的溢出,应该根据ADC指令的OF位来判断,而作低位加法用的ADD指令的溢出是无意义的此指令影响标志位3、加1指令INC(INCrement)加1指令的格式如下:

INCOPRD这条指令完成对操作数OPRD加1,然后把结果送回OPRD,即:OPRDOPRD+1操作数DST可以是通用寄存器,也可以是存储单元。这条指令执行的结果影响标志ZF、SF、OF、PF和AF,但它不影响CF。该指令主要用于调整地址指针和计数器。例如:写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令.要求使用以下几种寻址方式:(1)寄存器间接寻址MOVBX,OFFSETBLOCKADDBX,000AH

温馨提示

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

评论

0/150

提交评论