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

下载本文档

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

文档简介

微机原理与接口技术2/3/20231第二章

内容回顾2/3/20232第二章重点之一8086CPU内部结构2/3/20233目的变址寄存器DestinationIndexSIDIBPSPAX

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

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

计算机的指令包括:操作码+操作数↓↓操作的性质操作的对象↓存放在

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

各种寻址方式指令执行速度不同:操作数在寄存器中指令执行速度快:在CPU内部立即执行;立即数寻址指令执行速度较快:直接从指令队列中取数;操作数在存储器中指令执行速度较慢:通过总线与CPU交换数据。CPU进行读/写存储器的操作:①把一个偏移量送到BIU,计算出20位物理地址;②执行总线周期存取操作数。2/3/20239§3-18086的寻址方式——概述

寻址方式举例:2/3/202310§3-18086的寻址方式——概述

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

一、立即寻址方式(ImmediateAddressing)

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

例MOVCX,2A50H

解:将立即数2A50H送到CX寄存器中。(又例:MOVCL,20H)4.注意:①立即数可以送到寄存器、一个存储单元(8位)、两个连续的存储单元(16位)中去;MOVCX,2A50H②立即数只能作源操作数,不能作目的操作数;③以A~F打头的数字出现在指令中时,前面必须加数字0。以免与其它符号相混淆(如:0AF22H)。2/3/202313§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.注意:源操作数的长度必须与目的操作数—致。(注:以下寻址方式下,指令的操作数在存储器中,要先求物理地址才能获得操作数。)2/3/202314§3-18086的寻址方式——直接寻址方式三、直接寻址方式(DirectAddressing)

1.含义:存储单元的有效地址EA(即:操作数的偏移地址)直接由指令给出。2.特点:机器码中,有效地址存放在代码段中指令的操作码之后,而该地址单元中的数据总是存放在存储器中。须先求出操作数的物理地址,再从存储器中取得操作数。操作数的物理地址=16×DS+EA3.作用:实现对存储单元的读/写操作。2/3/202315§3-18086的寻址方式——直接寻址方式

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

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

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

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

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

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

2/3/202321§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=318BH4030002/3/202322

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

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

(SS:BP)

§3-18086的寻址方式——寄存器相对寻址方式2/3/202323§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不能同时出现在[]中。2/3/202324§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=0ABCDH2/3/202325§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不能同时出现在[]中。2/3/202326§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=26BFH2/3/202327§3-18086的寻址方式——寻址方式总结

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

1.立即数可以出现在方括号内,表示直接地址,如[2000H]。

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

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

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

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

2/3/202330§3-18086的寻址方式——其它

3.一条指令有多种寻址方式:源操作数和目的操作数同样适用上述寻址方法。例MOV[BX],AL解:设:BX=3600H,DS=1000H,AL=05H则:目的操作数的物理地址=16×DS+BX=10000H+3600H=13600H指令执行结果为(13600H)=05H。▲间接端口寻址方式:端口地址由寄存器DX提供,端口号为0000—FFFFH。例如,MOV DX,213H ;DX=口地址号213H INAL,DX ;AL←端口213H中的内容2/3/202331例3.DS=1000H,ES=2000H,SS=3500H,SI=00A0H,DI=0024H,BX=0100H,BP=0200H,VAL=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=20100H(5)MOVAX, [SI] 寄存器间接寻址,100A0H物理地址=DS×10H+SI=10000H+00A0H=100A0H2/3/202332(6)MOVAX, [BX+10H]寄存器相对寻址,10110H物理地址=DS×10H+BX+10H=10000H+0100H+10H=10110H(7)MOVAX, [BP] 寄存器间接寻址,35200H物理地址=SS×10H+BP=35000H+0200H=35200H(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/202333§3-38086的指令系统

§3-38086的指令系统

——

分类

分为以下六类:

数据传送指令

算术运算指令

逻辑运算和移位指令

字符串处理指令

控制转移指令

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

——数据传送指令

2/3/202335指令的共同特点是:

1、除POPF和SAHF指令外,这类指令的操作结果不会影响FR寄存器中的标志。

2、指令中有两个操作数,目的操作数和源操作数,其执行过程为:目的源,当指令中仅列出一个操作数时,另一操作数为隐含。§3-38086的指令系统

——数据传送指令

2/3/2023361.通用数据传送指令(GeneralPurposeDataTranfer):§3-38086的指令系统

——数据传送指令

⑴MOV传送指令(Move)指令格式:MOV目的,源指令功能:实现CPU的内部寄存器间或寄存器与存储器间的数据传送。例:MOVAX,0FF00H;MOV[DI],AX;MOVCX,[1000H];MOVBL,40MOVWORDPTR[SI],01H;MOVAL,BL;2/3/202337格式1:MOVreg/mem,immMOVAX,2050HMOVCL,58HMOVBYTEPTR[BX],55HMOVWORDPTR[BX],55H格式2:MOVseg/reg/mem,regMOVDS,AXMOVES,AXMOVSS,AX§3-38086的指令系统

——数据传送指令

2/3/202338

格式3:MOVseg/reg,memMOVDS,[BX]/MOVES,[BP+SI+25H]MOVAX,[2050H]/MOVAL,[2050H]注意:MOVmem,mem形式的指令是非法指令,也就是说,如果一条指令有两个操作数,不允许两个操作数都是存储器数,如下列指令为非法指令:MOV[BX],[2050H]/MOV[2050H],[BX+SI]该项规定不仅适用于“MOV”类指令,也适用于其他各类指令(串操作除外)。记住:CS不能作目的操作数§3-38086的指令系统

——数据传送指令

格式4:MOVreg/mem,segMOVAX,DS/MOVBX,ES/MOVAX,CSMOV[SI],DS/MOV[BX+SI],CSCS可以作源操作数2/3/202339§3-38086的指令系统

——数据传送指令

注意:▲指令中至少要有—项明确说明传送的是字节还是字,两个操作数类型要匹配;▲IP寄存器不能用作源操作数或目的操作数;▲立即数和CS寄存器不能用作目的操作数;▲除了源操作数为立即数的情况外,两个操作数中必有一个是寄存器,但不能都是段寄存器;这就是说,MOV指令不能在两个存储单元之间直接传送数据,也不能在两个段寄存器之间直接传送数据。2/3/202340§3-38086的指令系统

——数据传送指令

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

DATA SEGMENT;数据段开始AREA1DB14H,3BH;定义字节变量AREA2DB3DUP(0);复制操作ARRAYDW3l00H,01A6H;定义字变量STRINGDB‘GOOD’

DATA

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

——数据传送指令

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

;ALAREA1中的内容14HMOVAREA2,AL ;0002H单元14H例MOVAX,TABLE[BP][DI]解:将地址为l6×SS+BP+DI+TABLE的字存储单元中的内容送进AX。2/3/2023422)PUSH进栈指令指令格式:PUSH源操作数指令功能:将源操作数压入堆栈操作数要求:可以是16位通用寄存器、段寄存器、存储器中的数据字,但不能是立即数。栈中的存储单元作为目的操作数,指令操作如下:①SP←SP-1,SS:[SP]←src高8位②SP←SP-1,SS:[SP]←src低8位例1:PUSH[BX];(设DS:[BX]字单元数据为55AAH)xxHxxHxxHAAH55HxxHSS:[SP]指令执行前指令执行后SS:[SP]§3-38086的指令系统

——数据传送指令

2/3/202343指令格式:POP目的操作数(不包括CS!!!);指令功能:从堆栈栈顶弹出一个字到目的操作数目的操作数要求:可以是16位通用寄存器、段寄存器、存储单元,但CS不能作目的操作数。堆栈中的单元看作源操作数,指令操作如下:①dest低8位←SS:[SP],SP←SP+1②dest高8位←SS:[SP],SP←SP+1例2:POPBX;设接在例1后执行。AAH55HxxHSS:[SP]指令执行前AAH55HxxHSS:[SP]指令执行后55AAHBX3)POP出栈指令§3-38086的指令系统

——数据传送指令

2/3/202344使用堆栈指令:①堆栈操作是字操作指令,不要写出“PUSHAL”等。②在“POP”指令中,“POPCS”为非法指令。③堆栈中的数据弹出后,数据并没有在堆栈中消失,除非压入新数据,画图时注意。④堆栈操作指令不影响标志。⑤使用堆栈指令保护和恢复现场时,要注意指令的排列顺序,如:PUSHAXPUSHBXPUSHDS......POPDSPOPBXPOPAX§3-38086的指令系统

——数据传送指令

2/3/2023454)XCHG交换指令指令格式为:XCHG目的操作数,源操作数指令功能:将目的操作数的内容与源操作数的内容交换OPRD:R,MEM注意:①操作数不能为立即数;②源和目的不能同时为存储单元;③段寄存器不能作为操作数。§3-38086的指令系统

——数据传送指令

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

——数据传送指令

5)XLAT换码指令(查表转换) 指令格式:XLAT(转换表)

指令功能:将[BX+AL]的内容送到AL

XLAT指令使用步骤:使用之前必须先建立一个表格,表格中的内容是所需要转换的代码;将转换表的起始地址装入BX寄存器;欲查的某项与表头地址的位移量AL,即表格最多包含256个字节;执行XLAT指令后,根据位移量从表中查到转换后的代码值AL寄存器中。2/3/202347

§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=12H2/3/202348

§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位端口组成。

16位端口输入:先将给定端口中的字节送进AL;再把端口地址加1,然后将该端口中的字节读入AH。2/3/202349§3-38086的指令系统

——数据传送指令

例INAL,0F1H

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

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

;AL310H端口的内容

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

——数据传送指令

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

MOVDX,0FF4H ;端口地址DX=0FF4H OUTDX,AL ;0FF4H端口AL内容MOVDX,300H ;DX指向300HOUTDX,AX ;300H端口AL内容,301H端口AH内容2/3/2023523.地址目标传送指令(AddressObjectTransfers):

§3-38086的指令系统

——数据传送指令

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

指令格式:LEA目的,源

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

要求:

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

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

注意:与MOV指令的区别。2/3/202353§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实现,不能用MOV2/3/202354§3-38086的指令系统

——数据传送指令

⑵LDS将双字指针送到寄存器和DS指令(LoadPointerusingDS)指令格式:LDS 目的,源指令功能:源操作数指定的存储单元中的4字节地址指针

→一对目的寄存器。其中:前两个字节(偏移地址)→指定的目的寄存器;(常用SI寄存器)

后两个字节(段地址)→DS寄存器。操作数要求:源操作数:必须是存储单元(该单元开始的连续4个字节存放一个变量的地址指针);目的操作数:必须是16位寄存器,常用SI寄存器,但不能用段寄存器。例设:DS=1200H,(12450H)=0F346H,(12452H)=0A90H。执行指令LDSSI,[450H]后,结果如何?解:SI=0F346H,DS=0A90H2/3/202355§3-38086的指令系统

——数据传送指令

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

指令格式:LES 目的,源指令功能:源操作数指定的存储单元中的4字节地址指针

→一对目的寄存器。其中:前两个字节(偏移地址)→指定的目的寄存器;(常用DI寄存器)

后两个字节(段地址)→ES寄存器。例设:DS=0100H,BX=0020H,(01020H)=0300H,(01022H)=0500H。执行指令LESDI,[BX]后,结果如何?解:DI=0300H,ES=0500H2/3/202356

4.标志传送指令(FlagTransfers):

§3-38086的指令系统

——数据传送指令

读取标志指令:LAHF

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

——数据传送指令

⑴LAHF标志送到AH指令(LoadAHfromFlag)指令格式:LAHF指令功能:标志寄存器SF、ZF、AF、PF和CF→AH寄存器的位7、6、4、2和0。注意:◎位5、3、1的内容未定义,是任意值。◎执行这条指令后,标志位本身并不受影响。1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D02/3/202358§3-38086的指令系统

——数据传送指令

⑵SAHFAH送标志寄存器(StoreAHintoFlags)

指令格式:SAHF

指令功能:

AH内容

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

1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D02/3/202359§3-38086的指令系统

——数据传送指令

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

堆栈;

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

标志寄存器PSW;

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

——算术运算指令二、算术运算指令概述:算术运算指令可处理4种类型的数无符号二进制整数带符号二进制整数无符号压缩+进制整数(PackedDecimal)无符号非压缩+进制整数(UnpackedDecimal)一个8位二进制数可看成4种不同类型的数,所表示的数值亦不同。2/3/202361§3-38086的指令系统

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

二进制数:可以是8位或16位,若是带符号数,则用补码表示。压缩+进制数:一个字节中存放两个BCD码+进制数。非压缩+进制数:—个字节的低半字节存放+进制数,高半字节为全零。例如,对+进制数字58:压缩+进制数表示:只需一个字节,即01011000B非压缩+进制数表示:需两个字节,即00000101B和00001000B。4种数的类型的表示方法如下:2/3/202362§3-38086的指令系统

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

——算术运算指令算术运算指令的种类:2/3/2023641.加法指令(Addition)⑴ADD加法指令(Addition)

指令格式:ADD目的,

指令功能:目的

+目的

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

指令格式:ADC目的,

指令功能:目的

+

目的

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

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

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

——算术运算指令2/3/202365§3-38086的指令系统

——算术运算指令

例两种加法指令的实例ADDAL,18H ;ALAL+18H

ADCBL,CL ;BLBL+CL+CFADCAX,DX ;AXAX+DX+CF

ADDAL,COST[BX]

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

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

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

——算术运算指令⑶INC增量指令(Increment)

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

例INCBL ;BL寄存器中内容增1INCCX ;CX寄存器中内容增1例INCBYTEPRR[BX]

;内存字节单元内容增1INCWORDPTR[BX]

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

——算术运算指令2/3/202369§3-38086的指令系统

——算术运算指令⑷AAA加法的ASCII调整指令(ASCIIAdjustforAddition)指令格式:AAA指令功能:将AL寄存器中的运算结果调整为1位非压缩+进制数,仍保留在AL。如果AF=1,表示向高位有进位,则进到AH寄存器中。使用前提:用ADD或ADC指令对两个非压缩+进制数或ASCII码表示的+进制数作加法,运算结果已存在AL。(注:非压缩+进制数的高4位为全0,低4位为+进制数字0~9。例如,将9表示成00001001)2/3/202370调整过程:若AL低4位>9或AF=1则:①ALAL+6②用与操作(∧)将AL高4位清0③AF置1,CF置1,AHAH+l否则:将AL寄存器的高4位清0。§3-38086的指令系统

——算术运算指令2/3/202371§3-38086的指令系统

——算术运算指令例若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中得到一个正确的非压缩+进制数。2/3/202372§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。2/3/202373§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。2/3/202374§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。2/3/202375§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或CF=1,则ALAL+60H,对高4位进行调整,并使CF置1,否则CF置0。2/3/202376§3-38086的指令系统

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

⑴SUB减法指令(Subtraction)

指令格式:SUB目的,源指令功能:目的目的-源例SUBAX,BX ;AXAX—BX

SUBDX,1850H ;DXDX—1850H

2/3/202377§3-38086的指令系统

——算术运算指令⑵SBB带借位的减法指令(SubtractwithBorrow)

指令格式:SBB目的,源指令功能:目的目的-源-CF(SBB主要用于多字节减法中)例SBBAL,CL ;ALAL-CL-CF⑶DEC减量指令(Decrement)

指令格式:DEC目的指令功能;目的目的一l例DECBX ;BXBX—1DECWORDPTR[BP] ;堆栈段中位于[BP]偏置处的字减12/3/202378§3-38086的指令系统

——算术运算指令⑷NEG取负指令(Negate)

指令格式:NEG 目的指令功能:目的0-目的,即:对目的操作数取负例NEGAX ;将AX中的数取负

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

⑸CMP比较指令(Compare)

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

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

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

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

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

2/3/202379§3-38086的指令系统

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

2/3/202380§3-38086的指令系统

——算术运算指令例设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有重要意义。

2/3/202381§3-38086的指令系统

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

使用前提:用SUB或SBB指令对两个非压缩+进制数或ASCII码表示的+进制数作减法,运算结果已存在AL。

调整过程:若AL寄存器的低4位>9或AF=1,

则:①ALAL-6,AF置1

②将AL寄存器高4位清零

③AHAH-l,CF置l否则:不需要调整2/3/202382§3-38086的指令系统

——算术运算指令

例设AL=BCD3,CL=BCD8,求两数之差。解:运算过程如下: SUB AL,CL ; 00000011……BCD3 ;- 00001000……BCD8 ;______________________________ DAA ; 11111011……低4位>9 ;- 00000110……减6调整 ;______________________________ ; 11110101 ;∧

00001111……高4位清0 ;_______________________________ ; 00000101……AL=05H ;结果为BCD5,CF=1,表示向高位有借位注意:▲如果有借位,则CF置1;▲AAS指令必须紧跟在SUB或SBB指令之后。调整过程:若AL寄存器的低4位>9或AF=1,

则:①ALAL-6,AF置1

②将AL寄存器高4位清零

③AHAH-l,CF置l否则:不需要调整2/3/202383§3-38086的指令系统

——算术运算指令⑺DAS减法的+进制调整指令(DecimalAdjustforSubtraction)

指令格式:DAS

指令功能:将AL中两个压缩BCD数相减后的结果调整为正确的压缩BCD数。高4位和低4位分别进行调整。

使用前提:在两个压缩+进制数用SUB或SBB相减后,结果必须在AL中。调整过程:

①如果AL寄存器的低4位>9或AF=1

则:ALAL-6,AF置1

②如果AL高半字节>9或标志位CF=l

则:ALAL-60H,CF置12/3/202384§3-38086的指令系统

——算术运算指令例设AL=BCD56,CL=BCD98,求两数之差。解:运算过程如下: SUB AL,CL ; 01010110……BCD56 ;- 10011000……BCD98 ;_

温馨提示

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

评论

0/150

提交评论