《五章80868088指令系统课件》由会员分享,可在线阅读,更多相关《五章80868088指令系统课件(109页珍藏版)》请在金锄头文库上搜索。
1、第五章8086/8088 指令系统C第一节指令格式和寻址方式第一节指令格式和寻址方式C第二节数据传送指令第二节数据传送指令C第三节算术运算指令第三节算术运算指令C第四节逻辑运算指令第四节逻辑运算指令C第五节控制转移指令第五节控制转移指令C第六节字符串指令第六节字符串指令第一节指令格式和寻址方式i一、指令格式一、指令格式i二、指令助记符二、指令助记符i三、寻址方式三、寻址方式i(一)指令地址的寻址方式(一)指令地址的寻址方式i(二)操作数地址寻地方式(二)操作数地址寻地方式一、指令格式指令是计算机用以控制各部件协调动作的命令指令是计算机用以控制各部件协调动作的命令指指令令字字是是一一种种二二进进
2、制制代代码码,它它包包括括两两个个基基本本部部分分:操操作作码码和和地地址址码码。操操作作码码提提供供的的是是操操作作控控制制信信息息,指指明明计计算算机机应应执执行行什什么么性性质质的的操操作作,如如进进行行+、-、等等;地地址址码码提提供供参加运算操作数据的存放地址(即操作数地址)。参加运算操作数据的存放地址(即操作数地址)。只只提提供供一一个个操操作作数数地地址址的的指指令令,称称为为单单操操作作数数指指令令;提提供供二二个个操操作作数数地地址址的的指指令令,称称为为双双操操作作数数指指令令;不不提提供供操操作作数地址的指令,称为无操作数指令。数地址的指令,称为无操作数指令。无操作数指令
3、只有操作码部分,它的格式为无操作数指令只有操作码部分,它的格式为 其中其中为操作码。为操作码。这这种种指指令令表表示示只只进进行行某某种种操操作作,无无需需操操作作数数,如如控控制制机机器的运行状态,暂停(器的运行状态,暂停(HALTHALT)等,就属于无操作数指令。等,就属于无操作数指令。单操作数指令格式为单操作数指令格式为 其中其中为操作码;为操作码;D D为目标操作数地址,简称目标地址。为目标操作数地址,简称目标地址。这这种种指指令令表表示示对对目目标标地地址址D D中中的的内内容容,按按操操作作码码规规定定进行操作,结果送目标地址。进行操作,结果送目标地址。双操作数指令格式为双操作数指
4、令格式为 其其中中,为为操操作作码码,D D为为目目标标地地址址,S S为为源源地地址址(即即作作数数地址)。地址)。这这种种指指令令表表示示对对源源地地址址和和目目标标地地址址中中的的内内容容,按按操操作作码码规定的操作进行操作,结果送目标地址,即规定的操作进行操作,结果送目标地址,即DDSDDS。在在微微型型机机中中,一一般般采采用用可可变变字字长长指指令令。也也就就是是说说,不不同同的的指指令令用用不不同同长长度度来来表表示示,但但都都是是字字节节的的整整倍倍数数。如如一一字字节节、二二字字节节、三三字字节节和和四四字字节节指指令令等等。它它们们在在存存储储器器中中分分别别占占有有14个
5、存储单元,其格式如下:个存储单元,其格式如下:单字节指令:单字节指令: 操作码操作码 7 6 5 4 3 2 1 0 双字节指令:双字节指令: 第一字节:第一字节: 操作码操作码 第二字节:第二字节: 操作数或地址操作数或地址 三字节指令:三字节指令: 第一字节:第一字节: 操作码操作码 第二字节:第二字节: 操作数或地址低位操作数或地址低位 第三字节:第三字节: 操作数或地址高位操作数或地址高位 或:或: 第一字节:第一字节: 操作码操作码 第二字节:第二字节: 操作码操作码 第三字节:第三字节: 操作数或地址操作数或地址 四字节指令:四字节指令: 第一字节:第一字节: 操作码操作码 第二字
6、节:第二字节: 操作码操作码 第三字节:第三字节: 操作数或地址地位操作数或地址地位 第四字节:第四字节: 操作数或地址高位操作数或地址高位 二、指令助记符机机器器指指令令是是二二进进制制代代码码,二二进进制制代代码码不不易易辨辨识识和和记记忆忆。因因此此,在在介介绍绍机机器器指指令令时时,除除非非必必要要情情况况下下用用二二进进制制代代码码,一一般般情情况况下下使使用用指指令令助助记记符符。指指令令助助记记符符由由操操作作码码和和操操作作数数的的助助记记符符号号表表示示。通通常常操操作作码码用用英英文文单单词词或或英英文文缩缩写写单单词词来来表表示示如如:ADD,JP(Jump)等等。操操作
7、作数数用用表表示示寄寄存存器器存存储储器器地地址址的的符符号号来来表表示示。我我们们首首先先来来学学习习操操作作数数部部分分的的符符号号,然然后后结结合合指指令令来来学学习习表表示示操操作作码码的的符符号号。用用助助记记符符来来表表示示的的指令又称为指令的汇编格式。指令又称为指令的汇编格式。指令中要出现的符号介绍如下:指令中要出现的符号介绍如下:AX,BX,CX,DX 16位位通通用用寄寄存存器器AH,BH,CH,DH,AL,BL,CL,DL 8位通用寄存器位通用寄存器CS,DS,ES,SS 段寄存器段寄存器SP,BP ,IP 堆栈指针,基址指针,指令指针堆栈指针,基址指针,指令指针DI,SI
8、 目目的的,源源变变址址寄寄存存器器Flags 标志寄存标志寄存r r=AX、BX、CX、DX r=AL、BL、CL、DLa( acc) a=AX ALSeg seg=CS、DS、ES、SSSrc( source)、)、dst( dest)源操作数、目的操作数源操作数、目的操作数Count 计数器计数器Oprd 操作数操作数Im 立即数立即数 n 8位位 nn 16位位nnnn 32位位EA 有效地址有效地址三、寻址方式数数据据和和程程序序在在存存储储器器中中的的位位置置,称称为为地地址址。存存放放指指令令的的地地址址,称称为为指指令令地地址址;存存放放数数据据的的地地址址,称称为为操操作作数
9、数地地址址,简简称称操操作地址。作地址。寻寻找找指指令令地地址址和和操操作作数数地地址址的的方方式式,统统称称为为寻寻址址方方式式。形形成成指指令令地地址址和和操操作作数数地地址址的的过过程程,称称为为寻址过程。寻址过程。(一)指令地址的寻址方式(一)指令地址的寻址方式(二)操作数地址寻地方式(二)操作数地址寻地方式(一)指令地址的寻址方式在在微微机机中中,指指令令地地址址的的寻寻址址方方式式比比较较简简单单,通通常常是是在在CPU中设置程序计数器中设置程序计数器PC,PC中的内容就是指令地址。中的内容就是指令地址。在在一一般般情情况况下下,程程序序是是顺顺序序执执行行的的,程程序序在在存存储
10、储器器中中也也是是按按顺顺序序存存放放的的。这这时时,只只要要将将程程序序计计数数器器中中的的内内容容自自动动递递增,就可以形成下一条指令地址。增,就可以形成下一条指令地址。当当需需要要改改变变程程序序的的执执行行顺顺序序时时,要要使使用用转转移移指指令令,由由转转移移指指令令给给出出转转移移后后指指令令字字的的起起始始地地址址。将将此此地地址址送送到到程程序序计计数数器器,就就形形成成了了转转移移后后的的地地址址。然然后后,程程序序计计数数器器中中的的内内容容又自动递增,直到再次发生转移为止。又自动递增,直到再次发生转移为止。(二)操作数地址寻地方式微微机机在在工工作作时时,指指令令地地址址
11、在在程程序序执执行行过过程程中中时时自自动动形形成成的的,但但指指令令所所需需的的操操作作数数地地址址是是随随机机的的,要要根根据据指指令令的的规规定定求求得得,获获得得操操作作数数地地址址的的方方式式,称称为为操操作作数数寻寻址址方方式式,有有时时也把它称为寻址方式。也把它称为寻址方式。在在操操作作数数寻寻址址方方式式中中,除除了了涉涉及及BP的的寻寻址址方方式式外外,一一般般寻寻址址均均在在数数据据段段内内(段段地地址址由由DS提提供供),在在涉涉及及BP时时,则则使使用用堆堆栈栈段段(段段地地址址由由SS提提供供),在在执执行行串串操操作作时时,使使用用附附加加段段ES。在在各各种种寻寻
12、址址方方式式中中,以以立立即即数数和和存存储储器器直直接接寻寻址址方方式式,速速度度最最快快,因因为为此此时时8086/8088的的执执行行单单元元EU可可以以立立即即从从寄寄存存器器中中或或指指令令队队列列中中取取出出操操作作数数,而而无无须须再再由由总总线线执执行单元计算出有效的行单元计算出有效的20位地址,然后再去取操作数。位地址,然后再去取操作数。立即数寻址在指令中直接给出一个常数作为操作数,如:在指令中直接给出一个常数作为操作数,如: MOV AX,200表示将常数表示将常数200送到存储器送到存储器AX中,要注意的是在中,要注意的是在16位操位操作中,直接数的取值范围为作中,直接数
13、的取值范围为32767(7FFFH)到到-32768(8000H),),当为无符号数时则为当为无符号数时则为0-65535(0FFFFH),),对对8位数应为位数应为0-255(OFFH),),符号符号数为数为127(7FH)到到-128(80H)。)。2.寄存器直接寻址指令中的寄存器存放了操作数,如:指令中的寄存器存放了操作数,如: ADD CX,BX表示将表示将BX中的值直接相加,然后送到中的值直接相加,然后送到CX中去。中去。3.寄存器间接寻址在在指指令令中中,有有操操作作数数的的地地址址,将将该该地地址址同同左左移移4位位后后的的DS值值相相加加,即即可可得得到到20位位物物理理地地址
14、址,从从该该地地址址中中取取出出操操作作数数进进行行指指令令所所要要求求的的操操作作,这这种种寻寻址址方方法法称称为为直直接接寻寻址址,通通常该类指令中,操作数的地址用标号表示,例如:常该类指令中,操作数的地址用标号表示,例如:ADD AX、TABLE表表示示将将AX中中的的值值和和TABLE表表示示的的地地址址中中的的内内容容相相加加,和和放在放在AX中。中。8086/8088按按字字存存放放内内容容时时,低低字字节节方方在在低低地地址址中中,高字节跟随其后,方在高地址中。高字节跟随其后,方在高地址中。5.变址寻址将将指指令令中中指指令令的的变变址址寄寄存存器器的的内内容容加加上上偏偏移移值
15、值,即即成成为为操作的地址,例如:操作的地址,例如:MOV DI,4MOV AX,TABLEDI表表示示偏偏移移值值TABLE加加4(DI的的内内容容)作作为为操操作作数数地地址址,取出操作数送取出操作数送AX。这这种种寻寻址址方方式式通通常常用用于于读读写写表表中中的的元元素素,如如TABLE偏偏移移值值表表示示的的首首址址,加加4表表示示将将表表中中的的第第三三个个量量(16位位)送送AX,读写数组元素也采用此法。读写数组元素也采用此法。6.基址寻址同同变变址址类类似似,不不过过这这种种寻寻址址中中使使用用基基址址寄寄存存器器BX、BP代代替替变变址址寄寄存存器器DI和和SI。它它是是将将
16、基基址址寄寄存存器器的的内内容容加加上上偏偏移量而作为操作数地址的,例如:移量而作为操作数地址的,例如:MOV AX,BX+6表表示示BX作作为为基基址址,距距其其偏偏移移6字字节节的的地地址址便便是是操操作作数数地地址址,在在这这种种寻寻址址中中BX基基址址对对应应的的段段地地址址在在当当前前数数据据段段中中,若若基址是基址是BP,则操做数在堆栈段内。则操做数在堆栈段内。IBM汇汇编编允允许许用用三三种种形形式式指指定定基基址址寻寻址址,它它们们的的效效果果是是一样的,如:一样的,如:MOV AX,BX+6 ;标准格式标准格式MOV AX,6BX ;先写偏移值先写偏移值MOV AX,BX+6
17、 ;偏移值写在括号内偏移值写在括号内7.基址变址寻址基基址址变变址址寻寻址址时时,操操作作数数地地址址是是由由一一个个基基址址寄寄存存器器的的内内容容,一一个个变变址址寄寄存存器器的的内内容容及及偏偏移移值值(是是任任选选项项,也也可可不不用用)相加和,例如:相加和,例如:MOV AX,6BPSI表表示示距距栈栈顶顶6个个字字节节处处作作为为基基址址,然然后后以以SI内内容容为为相相对对基基址址的的偏偏移移作作为为操操作作地地址址,这这种种寻寻址址方方式式在在访访问问堆堆栈栈数数组组时时很很有有用用,如如基基址址为为栈栈顶顶,则则变变址址寄寄存存器器中中的的值值表表示示堆堆栈栈中中的的相应元素
18、。相应元素。这这种种寻寻址址方方式式也也多多用用于于对对二二维维数数组组的的访访问问,如如用用BX作作为为数数组组的的首首地地址址,变变址址寄寄存存器器及及偏偏移移值值作作为为数数组组行行和和列列的的值值,依次寻址,就可找到某个二维数组元素。依次寻址,就可找到某个二维数组元素。第二节数据传送指令第二节数据传送指令8086/8088有有92条指令,按其功能可分为条指令,按其功能可分为6个功能组:个功能组: 1.数据才传送数据才传送2.算术运算算术运算 3.逻辑运算逻辑运算 4.串操作串操作 5.控制传送控制传送 6.处理器控制处理器控制 数据传送指令又可分为以下七种:数据传送指令又可分为以下七种
19、: (1)通用数据传送指令通用数据传送指令MOV (2)堆栈操作指令堆栈操作指令 (3)交换指令交换指令 (4)标志寄存器传送指令标志寄存器传送指令 (5)输入输出指令输入输出指令 (6) 地址目的传送指令地址目的传送指令 (7)查表转换指令查表转换指令 这类指令用来在寄存器和存储单元或输入这类指令用来在寄存器和存储单元或输入/输出端口传输出端口传送数据或地址,表送数据或地址,表5.2.1列出这列出这7种指令种指令:汇编格式汇编格式 操作操作MOV dest,source 传送一个字节或字传送一个字节或字PUSH source 压一个字进栈压一个字进栈POP dest 弹一个字进栈弹一个字进栈
20、PUSHF 压标志寄存器进栈压标志寄存器进栈POPF 弹标志寄存器出栈弹标志寄存器出栈XCHG op1,op2 交换两个字节或字交换两个字节或字LAHF 将标志寄存器内容装入将标志寄存器内容装入AH中(装右字节)中(装右字节)SAHF 将将AH寄存器内容存到标志寄存器(右字节)寄存器内容存到标志寄存器(右字节)IN acc,port 从端口输入字节或字到累加器从端口输入字节或字到累加器OUT port,acc 从累加器输出一个字节或字到端口从累加器输出一个字节或字到端口LEA dest,source 装入有效地址,即将存储器操作数偏装入有效地址,即将存储器操作数偏 移地址送目的寄存器移地址送目
21、的寄存器LDS dest,source 将段地址装入将段地址装入DS中,偏移地址装入中,偏移地址装入 目的寄存器目的寄存器LES dest,source 将段地址装入将段地址装入ES中,偏移地址装入目中,偏移地址装入目 的寄存器的寄存器 XLAT 查表转换查表转换、MOV指令MOV指指令令是是最最基基本本的的通通用用传传送送指指令令,它它把把一一个个字字节节或或一一个字从源传送到目的。这条指令可实现下述操作:个字从源传送到目的。这条指令可实现下述操作:MOV nn,a ;(nn) aMOV a,nn ;a(nn)MOV seg,src ;segsrcMOV dst,seg ;dstsegMOV
22、 r,src ;rsrcMOV dst,r ;dstrMOV dst,im ;dstimMOV指指令令可可以以在在寄寄存存器器与与存存储储单单元元之之间间,寄寄存存器器和和寄寄存存器器之之间间传传送送字字节节或或字字,也也可可以以将将一一个个立立即即数数送送寄寄存存器器或或存存储储单元,例如:单元,例如:MOV AX,TABLE ;TABLE存储地址传送到存储地址传送到AXMOV TABLE,DX ;从从DX传送到存储地址传送到存储地址MOV ES;BX,AX ;指指定定段段寄寄存存器器到到ES,而而不不用用DSMOV DS,AX ;寄存器间寄存器间16位数传送位数传送MOV DL,AL ;8
23、位寄存器间传送位寄存器间传送MOV CL,30 ;常数送寄存器常数送寄存器MOV TABLE,05H ;常数送存储单元常数送存储单元2、堆栈操作指令目目前前,微微计计算算机机一一般般都都是是把把内内存存的的一一个个区区域域作作为为堆堆栈栈。这这个个堆堆栈栈按按照照后后进进先先出出的的原原则则组组织织一一段段内内存存区区域域,由由堆堆栈栈指指针针指指出出它它在在存存储储器器中中的的位位置置。8086/8088用用段段寄寄存存器器SS和和堆堆栈栈指指针针SP指指示示堆堆栈栈在在内内存存的的位位置置,这这个个堆堆栈栈长长度度为为64KB,因因此此SP为为16位位指指针针的的单单元元。8086/808
24、8规规定定SP始始终终指指向向堆堆栈栈的的顶顶部部,即即始始终终指指向向最最后后压压入入堆堆栈栈的的信信息息所所在在的的单单元元。8086/8088的的堆堆栈栈是是下下推推式式,即即随随着着压压入入堆堆栈栈的的内内容容的的增增加,加,SP的值减小。的值减小。SP的初值可由的初值可由MOV SP,im指令来设定。指令来设定。堆栈操作指令包括入栈指令和出栈指令。堆栈操作指令包括入栈指令和出栈指令。(1)入栈指令)入栈指令 PUSH oprd 入栈指令完成将入栈指令完成将16位的数据送入堆栈的操作,具体入栈位的数据送入堆栈的操作,具体入栈指令如下:指令如下:PUSH r ;(SP) r,SPSP-2
25、PUSH seg ;(SP) seg,SPSP-2PUSH src ;(SP) src,SPSP-2(2) 出栈指令出栈指令 POP oprd出栈指令完成将出栈指令完成将16位的数据从堆栈弹出的操作,具体出位的数据从堆栈弹出的操作,具体出栈指令如下:栈指令如下:POP r ;r(SP),SPSP+2POP seg ;seg(SP),SPSP+2POP dst ;dst(DP),SPSP+2入入栈栈时时,把把一一个个字字从从上上述述操操作作数数传传送送到到已已由由SP指指向向的的堆堆栈顶部,同时修改栈顶部,同时修改SP的值,使的值,使SP指向新的栈项单元。指向新的栈项单元。出出栈栈时时,把把堆堆
26、栈栈顶顶部部的的一一个个字字,传传送送到到指指定定的的目目标标操操作作数,同时修改数,同时修改SP的值,使的值,使SP指向新的栈顶单元。指向新的栈顶单元。PUSH和和POP指指令令提提供供一一个个先先进进后后出出的的堆堆栈栈结结构构,它它们们用用SS栈栈寄寄存存器器来来指指向向栈栈的的段段地地址址,用用SP堆堆栈栈指指针针来来指指向向栈栈顶顶位位置置,当当执执行行PUSH指指令令时时,SP减减2后后,将将源源操操作作数数(一一个个字字)压压入入栈栈内内,相相反反POP指指令令则则将将当当时时SP所所指指定定的的堆堆栈栈中中的的字字取取出到目的操作数,然后出到目的操作数,然后SP加加2。PUSH
27、和和POP指指令令提提供供了了一一种种存存储储的的技技巧巧,例例如如可可用用于于数数据据交交换换,将将DS的的值值传传给给ES,使使数数据据段段和和附附加加段段指指向向同同一一个个段地址:段地址:PUSH DSPOP ES又又如如在在程程序序中中要要用用到到某某一一寄寄存存器器,它它的的值值在在程程序序中中某某一一段段将将被被改改变变,而而后后面面又又要要用用到到它它,且且需需要要它它的的原原先先值值,可可采采用如下方法:用如下方法:PUSH AX ;将将AX值存入堆栈值存入堆栈 ;AX的的值值被被改改变变的的程程序序段段POP AX ;再取回再取回AX的原先值的原先值(3)PUSHF和和PO
28、PF指令指令PUSHF和和POPF是是将将标标志志寄寄存存器器内内容容入入栈栈和和出出栈栈,这这两两种种指指令令在在调调用用子子程程序序,保保存存标标志志寄寄存存器器内内容容时时常常用用到到,即即在在调调用用前前标标志志寄寄存存器器入入栈栈,返返回回主主程程序序时时,恢恢复复其其值值。另另外外,当当标标志志寄寄存存器器TF位位为为1时时,8086/8088在在每每执执行行一一条条指指令令后后,便便执执行行一一条条1型型中中断断指指令令,即即指指令令执执行行变变成成单单步步方方式式,这这在在调调试试程程序序时时可可用用到到,以以便便跟跟踪踪每每条条指指令令执执行行情情况况。由由于于没没有有任何一
29、条指令能使任何一条指令能使TF变成变成1,但这可用下面的方法实现:,但这可用下面的方法实现:PUSHF ;标志进栈标志进栈POP AX ;标志值送标志值送AXOR AX ,0100H ;使使TF位置位置1PUSH AX ;AX进栈进栈 POPF ;将将AX值送到标志寄存器值送到标志寄存器若若要要恢恢复复TF=0,则则可可将将OR AX,0100H换换成成AND AX,0FEFFH来清除来清除TF。3、交换指令具体的指令如下:具体的指令如下: XCHG AXXCHG AX,r ;AX rr ;AX r XCHG r, XCHG r,srcsrc ;r ;r src src XCHG XCHG指令
30、用于交换源操作数和目的操作数的内容,源和指令用于交换源操作数和目的操作数的内容,源和目的操作数可以在寄存器或单元中,但不能同为存储单元,目的操作数可以在寄存器或单元中,但不能同为存储单元,段寄存器也不能用作操作数。下面是寄存器交换段寄存器也不能用作操作数。下面是寄存器交换例如:例如: MOV AXMOV AX, 50 50 MOV BX MOV BX,1010 XCHG AX XCHG AX,BX BX ;现在现在AX=10AX=10,BX=50BX=504标志寄存器传送指令LAHF和SAHFLAHF指指令令是是将将标标志志寄寄存存其其中中标标志志CF.PF.AF.ZF.和和SF分分别别送送到
31、到AH的的0.2.4.6.7位位,而而SAHF指指令令却却相相反反,它它是是将将AH的相应位内容送到标志寄存器的的相应位内容送到标志寄存器的CF、PF、AF、ZF和和SF位。位。5.输入输出指令IN和OUTIN和和OUT指指令令用用来来读读写写I/O口口,8086/8088可可寻寻址址的的口口地地址址可可达达64K个个,口口地地址址可可用用DX或或立立即即数数表表示示,如如用用立立即即数数,则则仅能寻址仅能寻址0-FFH,读写的数据必须从读写的数据必须从AX中接收或传送中接收或传送,例如例如:IN AL,2FH ; 从从2FH口输入一个字节到口输入一个字节到ALOUT 5,AL ; 将将AL中
32、的数送到中的数送到5口中去口中去MOV DX,3FCH ;3FCH口地址送口地址送DXIN AX,DX ; 从从3FCH口读一个字到口读一个字到AX中中这这类类指指令令在在接接口口技技术术中中使使用用较较多多,当当读读写写一一个个字字时时,先先是是低低字字节节,然然后后是是高高字字节节(因因为为数数据据总总线线是是8位位,所所以以必必须须分分两两次次读读写写),如如从从3FCH口口读读一一个个字字时时,实实际际上上从从3FCH口口读读一一个个字字节到节到AL中去中去.然后从然后从3FCH口再读一个字节到口再读一个字节到AH中去。中去。6.地址-目标传送指令8086/8088有三条地址有三条地址
33、-目标传送指令目标传送指令: LEA r,src LDS r,src LES r,src LEA指指令令将将一一个个储储储储器器中中数数据据的的偏偏移移地地址址送送到到任任一一个个通通用用寄存器寄存器.指针寄存器或变址寄存器指针寄存器或变址寄存器,例如例如: LEA BX,TABLEDI 将把将把TABLE+DI的偏移地址送到的偏移地址送到BX中中. LDS指指令令将将从从指指定定的的存存储储器器地地址址中中取取出出一一个个32位位的的双双倍倍字字,将其低将其低16位送到指定的字寄存器位送到指定的字寄存器,而将高而将高16位送到位送到DS,例如例如: LDS BX,ARRAY ARRAY假假如
34、如为为一一个个双双倍倍字字长长的的字字,比比如如是是代代表表一一个个物物理理地地址址的的变变量量,执执行行此此指指令令后后将将ARRAY高高二二字字节节表表示示的的段段地地址址送送入入DS中中,而而将将其其低低二二字字节节表表示示的的偏偏移移地地址址送送入入BX中中,这这相相当当执行了三条指令执行了三条指令: MOV BX,ARRAY MOV AX,ARRAY+2 MOV DS,AX LES指令将段地址送入指令将段地址送入ES中中,其别的功能同其别的功能同LDS.7.查表转换指令XLATXLAT指指令令可可进进行行查查表表操操作作此此表表可可达达256个个字字节节.使使用用该该指指令令时时,将
35、将表表的的起起始始地地址址送送入入BX中中,将将表表的的位位移移值值(即即要要查查表表的的位位置置)送送入入AL中中.。然然后后执执行行XLAT指指令令,则则将将查查到到的的值值存存入入AL中中.第三节算术运算指令8086/8088有有加加、减减、乘乘、除除四四种种基基本本的的运运算算指指令令,这这些些指指令令可可用用于于字字节节或或字字运运算算,可可用用于于带带字字号号数数与与无无符符号号数数的的运运算算。如如果果是是符符号号数数,则则用用补补码码表表示示。大大部部分分指指令令操操作作影影响标志寄存器响应位。算术运算指令如表响标志寄存器响应位。算术运算指令如表5.3.1所示所示8086/80
36、88提提供供各各种种矫矫正正操操作作指指令令,这这些些矫矫枉枉正正操操令令与与二二进进制制算算术术运运算算指指令令配配合合使使用用,使使得得8086/8088也也能能进进行行十十进进制制算算术术运运算算。十十进进制制数数不不带带符符号号,可可用用压压缩缩十十进进制制数数(BCD),或或非非压压缩缩型型十十进进制制表表示示,前前者者每每个个字字可可包包含含两两个个用用场场4位位二二进进制制码码表表示示的的十十进进制制数数,即即十十进进制制数数的的范范围围为为0099;对对非非压压缩缩型型的的数数,则则一一个个字字节节仅仅表表示示一一个个十十进进制制数数即即09,字字节节的的高高4位位在在作作乘乘
37、除除运运算算时时必必须须为为0 ,加加减减时时可可任意。任意。;1 1、加减法运算指令、加减法运算指令 、;2 2、比较指令、比较指令;3 3、INCINC、DNCDNC、NECNEC指令指令;4 4、乘法与除法指令、乘法与除法指令MULMUL、IMULIMUL、DIVDIV、IDIVIDIV;5 5、CBWCBW与与CWDCWD指令指令;6 6十进调整指令十进调整指令1、加减法运算指令 、A加法指令加法指令A带进位加法指令带进位加法指令A减法指令减法指令A带借位减法指令带借位减法指令()、加法指令 , ; , ; , ; , ;()带进位加法指令 , ; , ;A D C , ;A D C
38、, ;其中为进位标志的现行值。其中为进位标志的现行值。()减法指令SUB , ;SUB , ;SUB , ; SUB , ; (4) 带借位减法指令SBB r, src ; r r src cSBB a,im ; a a im c SBB dst,im ; dst dstimcSBB dst,r ; dst dstrc其中其中c为借位标志的现行值为借位标志的现行值、均均是是作作加加减减运运算算的的指指令令,其其功功能能是是源源操操作作数数与与目目的的操操作作数数进进行行相相加加或或相相减减,而而与与的的差差别别是是为为带带进进位位的的加加,同同样样是是带带借借位位的的减减,源源操操作作数数可可
39、以以在在寄寄存存器器、存存储储器器中中或或立立即即数数,目目的的操操作作数数可可以以在在寄寄存存器器、存存储储器器中中。这这些些指指令令运运算算的的结结 突突目目的的操操作作数数中中。上上述述指指令令可可完完成成位位(字字节节)或或位运算超过位则需多条指令。位运算超过位则需多条指令。比如操作数长度大于位的加法,用下面的指令比如操作数长度大于位的加法,用下面的指令 , ;低位相加;低位相加 , ;带低位进位的高位相加;带低位进位的高位相加这这两两条条指指令令将将把把和和中中的的位位数数加加到到和和中中的的位位数数中中,县县后后面面的的一一条条指指令令,还还将将低低位位的的进进位位也也一一起起加加
40、上上,结结果果在在和和中中。又又比比如如操操作作数数长长度度大大于位的减法,可用下面的指令于位的减法,可用下面的指令 , ;低位相减;低位相减 , ;带低位借位的高位相减;带低位借位的高位相减作减法时,不仅和相减,还要减去上条作减法时,不仅和相减,还要减去上条指令执行相减后的借位,最后的结果低位将在中,指令执行相减后的借位,最后的结果低位将在中,高位将在中。高位将在中。这类指令不能用于存储单元容的加减,也不能用立即数这类指令不能用于存储单元容的加减,也不能用立即数作为目的操作数。它们的运算结果均将影响标志寄存器的作为目的操作数。它们的运算结果均将影响标志寄存器的、和。、和。、比较指令比比较较指
41、指令令完完成成两两个个操操作作数数加加减减,使使结结果果反反映映到到标标志志位位上上,并不送回相减的差值。指令格式如下:并不送回相减的差值。指令格式如下:CMP , ;CMP , ; CMP , ;CMP , ;指指令令是是比比较较指指令令,用用于于目目的的操操用用数数 与与源源操操用用数数 进进行行比比较较,即即相相减减,类类似似于于指指令令,但但不不同同的的是是,该该指指令令不不保保存存相相减减的的结结果果,因因而而不不变变操操作作数数 ,它它仅仅影影响响标标志志寄寄存器,表存器,表.示出了比较指令影响标志位的情况。示出了比较指令影响标志位的情况。一一般般在在使使用用指指令令时时,后后面面
42、总总是是跟跟着着一一条条条条件件转转移移命命令令,跟跟据据比比较较结结果果标标志志位位的的情情况况决决定定程程序序的的执执行行方方向向,由由表表. . .可看出:可看出:两位比较要等用零标志位两位比较要等用零标志位ZFZF,若若ZFZF1 1则表示相等。则表示相等。不不带带符符号号数数比比较较大大小小时时,当当借借位位标标志志CFCF1 1时时,说说明明源源目的,否则目的源。目的,否则目的源。带带符符号号数数比比较较大大小小时时,用用符符号号标标志志SFSF与与溢溢出出OFOF半半加加(异异或或)来来判判断断,若若SFOFSFOF1 1,则则源源目目的的,否否则则源源目目的的。例如:例如:CM
43、P AXCMP AX,8000H 8000H ;AX AX 与与80008000H H相比较相比较JL AGAIN JL AGAIN ;如如AXAX小于小于80008000H H则转则转AGAINAGAIN当当CMPCMP执执行行后后,若若SFOFSFOF时时,(即即SFCFSFCF1 1),即即源源目的,则转移。目的,则转移。3、INC、DNC、NEC指令INCINC和和DECDEC指指令令仅仅有有一一个个操操作作数数,其其操操作作可可以以是是位位或或位位的的通通用用寄寄存存器器值值,也也可可以以是是存存储储单单元元中中的的数数,将将执执行行操操作作数数加加的的操操作作,指指令令将将执执行行
44、操操作作数数减减的的操操作作,结结果果仍仍送送回回操操作作的的位位置置中中去去。这这两两条条指指令令操操作作结结果果均均不不影响影响CFCF标标. .。NECNEC指指令令为为求求补补指指令令,它它是是从从零零中中减减去去操操作作数数,形形成成2 2 的的补补, ,操操作作数数仅仅有有一一个个,可可以以是是寄寄存存器器的的破破除除储储存存单单元元的的数数。例如:例如:NEC DATANEC DATADATADATA存存储储单单元元内内设设有有数数为为0000010100000101,则则执执行行该该指指令令后后,其内容就变为其内容就变为1111101111111011。当从一个立却数中减去寄存
45、器或存储器中的数时,不能当从一个立却数中减去寄存器或存储器中的数时,不能用用SUBSUB指令,但可以减数变补,然后再和其相加得到减的果,指令,但可以减数变补,然后再和其相加得到减的果,如立即数为如立即数为100100,则可用如下命令:,则可用如下命令:NEG ALNEG ALADD AL,100ADD AL,1004、乘法与除法指令MUL、IMUL、DIV、IDIV80888088提供乘法与除法指令,具体指令格式如下:提供乘法与除法指令,具体指令格式如下:MULMUL src src ; AXAL*; AXAL*srcsrc( (无符号数无符号数) )MULMUL src src ; DX;
46、DX、AXAX*AXAX*srcsrc(无符号数)无符号数)IMULIMUL src src ; AXAL*; AXAL*srcsrc(符号数)符号数)IMULIMUL src src ; DX ; DX 、AXAX*AXAX*srcsrc(符号数)符号数)DIVDIV src src ; ALAX/; ALAX/srcsrc,AH,AH余数余数DIVDIV src src ; AXDX. AX/ ; AXDX. AX/srcsrc, DX, DX余数余数IDIVIDIV src src ;ALAX/ ;ALAX/srcsrc, AH, AH余数(符号数)余数(符号数)IDIVIDIV src
47、 src ; AXDX ; AXDX 、 AX/ AX/srcsrc,DX,DX余数(符号数)余数(符号数)MULMUL是是无无符符号号数数乘乘法法指指令令,IMULIMUL是是带带符符号号数数的的乘乘法法指指令令(整整数数乘乘法法),它它们们都都可可以以完完成成字字节节与与字字节节相相乘乘,字字与与字字的的相相乘乘,这这些些乘乘法法指指令令均均认认为为目目的的操操作作数数在在ALAL和和AXAX中中,源源操操作作数数由由指指令令指指出出,当当1616位位乘乘法法时时,3232位位的的乘乘积积规规定定高高1616位位在在DXDX中,低中,低1616位在位在AXAX中。中。在在8 8位位或或16
48、16乘乘法法若若扩扩展展部部分分AHAH或或DXDX为为0 0则则CF=0CF=0,OF=0OF=0,反反之之CF=1CF=1。OF=1OF=1。IMULIMUL是是带带符符号号数数乘乘法法 ,执执行行情情况况同同MULMUL,不不过过在在1616位位或或3131位乘积中,包括一位符号位。位乘积中,包括一位符号位。DIVDIV是是无无符符号号除除法法指指令令,它它可可以以进进行行字字节节或或字字除除法法,DIVDIV规规定定:对对于于8 8位位除除法法,被被除除数数在在AX AX 中中,对对于于1616位位除除法法,被被除除数数则则在在DXDX与与AXAX中中,而而除除数数在在指指令令中中指指
49、出出。除除完完的的结结果果,对对8 8位数除法,商与余数分别放在位数除法,商与余数分别放在AXAX与与DXDX中。中。IDIVIDIV是带符号是带符号 数除法,情况同数除法,情况同DIVDIV,除后余数符号和被除后余数符号和被除数相同除数相同 。这两条除法指令都不能用立即数作源操作,但。这两条除法指令都不能用立即数作源操作,但若需要时,可用如下指令来实现,例如:若需要时,可用如下指令来实现,例如: MOV BXMOV BX,1010 DIV BX DIV BX ;用用1010去除去除DXDX:AXAX5、CBW与CWD指令上上述述的的除除法法,被被除除数数均均是是除除数数的的双双倍倍字字长长,
50、若若要要进进行行相相同同字字长长的的除除法法,则则需需将将被被除除数数扩扩展展为为双双倍倍字字长长,这这就就要要用用下下面两条指令:面两条指令:CBW是是将将字字节节扩扩展展为为字字指指令令,它它是是将将AL 中中的的符符号号扩扩展展到到AH的的所所有有位位去去,CWD是是扩扩展展为为双双字字指指令令,它它是是将将AX的的符符号号(第第15)扩扩展展到到DX的的所所有有位位去去,例例如如AL中中的的内内容容为为-2,执执行行CBW后后 AH AL 1111111111111110=-2下面是一个四则运算的例子:下面是一个四则运算的例子: 设设BH=FB(即即-5) BL=FE(-2) CH=(
51、-20) CL=05 计算计算(BH*BL)+(CH/CL) AX MOV AL, BH ; AX=FB IMUL BL ; AX=000A=-5(-2) MOV DX,AX ; 暂时保存结果暂时保存结果 MOV AL,CH ; AX=00EC(-20) CBW ;AX=FFEC,扩展为双扩展为双 字节字节 IDIV CL ; AX=00FC(-4) CBW ; AX=FFFC ADD AX、DX ; AX=0006=+6 6十进调整指令/(1 1)DAADAA指令指令/(2 2)AAAAAA指令指令/(3 3)DASDAS和和AAS AAS 指令指令/(4 4)AAMAAM与与AADAAD指
52、令指令(1)DAA指令当当BCD码码的的十十进进制制运运算算用用二二进进制制进进行行时时,有有两两种种情情况况需需要要进进行行调调整整:1、运运算算的的结结果果出出现现非非法法的的BCD码码(即即大大于于的的数数);2、运运算算产产生生半半字字节节间间的的进进位位。调调整整的的方方法法是是加加6进进行行修正。修正。DAA指指令令就就是是按按上上述述原原则则进进行行十十进进制制调调整整的的,它它是是一一条条无操作数指令,与无操作数指令,与ADD指令配合实现压缩型十进制加法。指令配合实现压缩型十进制加法。(2)AAA指令AAAAAA是是非非压压缩缩型型十十进进制制加加法法调调整整指指令令,它它的的
53、作作用用是是将将ALAL中中的的数数换换成成一一个个非非压压缩缩型型十十进进制制数数,即即AAAAAA指指令令执执行行时时,检检查查ALAL的的低低4 4位位,若若是是一一个个合合法法的的BCDBCD码码,则则清清除除ALAL的的高高4 4位位,否否则则按按上上述述修修正正原原则则进进行行低低4 4位位修修正正,并并将将ALAL的的高高4 4位位清清零零。例例如如ALAL中中的的内内容容为为00001001=900001001=9,CLCL的的内内容容为为00001000=800001000=8,执执行如下指令:行如下指令:ADD AL,CLADD AL,CLAAAAAA执执行行ADDADD后
54、后,ALAL中中的的内内容容为为0001000100010001,因因AF=1AF=1,故故AAAAAA指指令令进进行行调调整整,将将ALAL中中的的低低4 4位位加加6 6,即即变变成成0001011100010111,然然后后高高4 4位位清清零零成成为为0000011100000111,并并且且AHAH加加1 1,因因此此AHAH中中为为0000000100000001,ALAL中为中为0000011100000111,得到两个非压缩型十进制数。,得到两个非压缩型十进制数。(3)DAS和AAS 指令DASDAS是是压压缩缩型型十十进进制制数数减减法法调调整整指指令令,AASAAS是是非非
55、压压缩缩型型十十进进制制数数减减法法调调整整指指令令,它它们们同同ADDADD和和AAAAAA指指令令一一样样,不不要要操操作作数,且假定要调整的数在数,且假定要调整的数在ALAL中。中。DASDAS的的调调整整过过程程是是:若若ALAL的的低低4 4位位大大于于9 9或或AF=1AF=1,则则从从AFAF中中减减去去6 6,并并置置AF=1AF=1,若若ALAL的的高高4 4位位大大于于9 9,或或CF=1CF=1,则则从从ALAL中高中高4 4位减去位减去6 6,并置,并置CF=1CF=1,如用下述指令:如用下述指令:SUB SUB ALAL,BL BL ;ALAL中中的的数数(压压缩缩的
56、的BCDBCD码码)减减去去BLBL(压缩的压缩的BCDBCD码)码)DASDAS ;调整结果,调整结果,ALAL中为正确的码。中为正确的码。 AASAAS指指令令将将ALAL中中的的内内容容调调整整成成非非压压缩缩型型十十进进制制码码,即即如如果果ALAL低低4 4位位大大于于9 9,或或AF=1AF=1,则则减减去去6 6,AHAH减减1 1,并并置置AF=1AF=1,CF=1CF=1,并清除并清除ALAL高高4 4位。位。(4)AAM与AAD指令AAM是是非非压压缩缩型型十十进进制制乘乘法法调调整整指指令令,它它与与指指令令配配合合使使用用,把把中中的的两两个个非非压压缩缩型型十十进进制
57、制数数相相乘乘所所得得结结果果加加以以校校正正。AAM指令必须跟在指令必须跟在MUL指令后。指令后。AAD是是非非压压缩缩型型十十进进制制除除法法调调整整指指令令,它它要要在在执执行行除除法法之之前前使使用用,它它是是将将非非压压缩缩十十进进制制表表示示的的被被除除数数换换成成第第二二进进制制值值送送到到AL中中,即即AAD将将被被除除数数高高位位(AH)乘乘10,然然后后加加到到低位(低位(AL)上,并将上,并将AH清零,清零,ADD用法如下所示:用法如下所示: AAD ;将非压缩型十进制数调整将非压缩型十进制数调整 DIV BL ; 完成除法。完成除法。第四节逻辑运算指令8086/8088
58、8086/8088逻逻辑辑运运算算指指令令组组包包括括逻逻辑辑运运算算指指令令、移移位位指指令令和和循循环环移移位位指指令令。它它们们是是对对寄寄存存器器或或存存储储单单元元进进行行位位操操作作的的指指令令,也也称称位位操操作作指指令令。逻逻辑辑运运算算指令如表指令如表5.4.15.4.1所示所示. .一、逻辑运算指令一、逻辑运算指令二、移位指令二、移位指令三、循环指令三、循环指令一、逻辑运算指令1 1、NOTNOT指令指令 这这条条指指令令对对原原操操作作数数求求反反,然然后后再再送送回回原原操操作作数数。指指令令格式为:格式为: NOT NOT srcsrc ; ; src src src
59、src,这条指令对标志位无影响。这条指令对标志位无影响。 2、AND指令这条指令对两个操作数按位进行逻辑这条指令对两个操作数按位进行逻辑“与与”运算。运算。与与运运算算通通常常用用符符号号“X X”或或“ ”或或“. .”来来表表示示,它它的的运算规则为:运算规则为:00=0 01=0 10=0 11=1 00=0 01=0 10=0 11=1 ANDAND指指令令可可以以进进行行字字节节操操作作,也也可可以以进进行行字字操操作作。指指令令的一般格式为:的一般格式为:ANDAND dst dst, , src src; ; dst dst dstdst src src 其其中中目目的的操操作作
60、数数可可以以用用累累加加器器,也也可可以以是是任任意意一一通通用用寄寄存存器器,也也可可以以是是各各种种寻寻址址方方式式的的存存储储器器操操作作数数。原原操操作作数数可可以是立即数,寄存器和各种寻址方式的存储器操作数。例如:以是立即数,寄存器和各种寻址方式的存储器操作数。例如: AND AX, BX AND AX, BX AND AL, F0H AND AL, F0H AND SI, BP AND SI, BP AND DATA AND DATAWORD, AXWORD, AX AND AX, AX AND AX, AX某某个个操操作作数数与与本本身身进进行行“与与”运运算算,操操作作数数不不
61、变变,但但可可以是进位标志位以是进位标志位CFCF清清“0 0”。ANDAND指令常用与屏蔽(清除)操作数的指定位。例如:指令常用与屏蔽(清除)操作数的指定位。例如: AND AX, OFFHAND AX, OFFH结果结果AHAH被清被清“0 0”,而,而ALAL值不变。值不变。3、OR指令这这条条指指令令对对两两个个操操作作数数控控位位进进行行逻逻辑辑“或或”运运算算,结结果果送送回回目目的的操操作作数数。或或运运算算通通常常用用符符号号“+ +”或或“ ”表表示示,它它的运算规则为:的运算规则为:0 0v0=0 v0=0 0v1=1 0v1=1 1v0=1 1v0=1 1v1=1 1v1
62、=1 OROR指指令令可可以以进进行行字字节节操操作,也可以进行字操作。指令的一般格式为作,也可以进行字操作。指令的一般格式为 OROR dst dst , ,srcsrc ; ; dst dst dstdstsrcsrc其中的目的操作数河源操作数,其中的目的操作数河源操作数, 与与ANDAND指令相同。指令相同。某某个个操操作作数数本本身身进进行行或或运运算算,操操作作数数不不变变,但但可可以以是是进进位标志位位标志位CFCF清清“0 0”。例如:。例如:OR AX , AXOR AX , AX操作的结果是:操作数不变,但使操作的结果是:操作数不变,但使CFCF清清“0 0”。4、XOR指令
63、 XOR指指令令用用于于异异或或操操作作,将将源源操操作作数数与与目目的的操操作作数数做做异异或或运运算算,然然后后送送目目的的操操作作数数。异异或或运运算算通通常常用用符符号号表表示示,它的运算规则为:它的运算规则为:00=0 01=110=1 11=0运运算算的的结结果果相相当当于于二二个个一一位位的的二二进进制制数数做做加加法法的的结结果果(进位丢掉),所以又把异或运算称为(进位丢掉),所以又把异或运算称为“按位加按位加”。 XOR dst, src ;dst dstsrc 其中,目的操作数和原操作数与其中,目的操作数和原操作数与AND指令相同。指令相同。 XOR 指令可用对数据指定位进
64、行求反。指令可用对数据指定位进行求反。XOR AL, OFFH则将则将AL 中所有位求反。中所有位求反。某操作数与其本身进行异或运算可使操作数和进位志位某操作数与其本身进行异或运算可使操作数和进位志位CF都清都清“0”。例如:。例如:XOR AX,AXNOT、 AND 、OR 、 XOR指令都是按位操作的逻辑运指令都是按位操作的逻辑运算指令,运算结果算指令,运算结果影响标志寄存器部分标志位。影响标志寄存器部分标志位。5、TEST指令TEST指指令令是是一一条条测测试试指指令令,它它执执行行的的操操作作与与AND相相同同,不过它不回送结果。不过它不回送结果。只只影影响响标标志志位位,该该指指令令
65、常常与与条条件件转转移移指指令令配配合合使使用用,以以决定程序的转移方向。决定程序的转移方向。二、移位指令8086/8088有四条移为指令:有四条移为指令: 算术左移指令算术左移指令 SAL dst,cout 逻辑左移指令逻辑左移指令 SHL dst,count 算数右移指令算数右移指令 SAR dst,count 逻辑右移指令逻辑右移指令 SHR dst,count 其其中中SAL与与SHL 指指令令功功能能完完全全相相同同。这这些些指指令令的的功功能能如如图图5.4.1。 移移位位指指令令可可将将通通用用寄寄存存器器或或存存储储单单元元的的8位位或或16位位的的数数左左移移或或右右移移,其
66、其移移位位方方向向由由指指令令决决定定,移移动动位位数数由由指指令令中中的的计计数值所决定,计数值可以是数值所决定,计数值可以是1或存放在或存放在CL中的无符号数。中的无符号数。这些移位指令如下所示。例如:这些移位指令如下所示。例如:MOV DMOV D,1 1将将D D中的数逻辑右移中的数逻辑右移1 1位,位,D D可以是寄存器或存储器单元。可以是寄存器或存储器单元。当要移多位时,则可用当要移多位时,则可用CLCL作移位计数器,例如:作移位计数器,例如:MOV CLMOV CL,2 2SHL BLSHL BL,CLCL;将将BLBL中的低中的低4 4位左移到高位左移到高4 4位,低位,低4
67、4位变为位变为0 0。常常利利用用移移位位指指令令,作作快快速速的的乘乘除除法法,例例如如:某某数数乘乘4 4或或除除4 4的的运算。运算。MOV CLMOV CL,2 2SHL AX SHL AX ,CL CL ;AXAX中的无符号数乘中的无符号数乘4 4SAL AXSAL AX, CL CL ;AXAX中带符号数乘中带符号数乘4 4SHR AXSHR AX, CL CL ;无符号数除以无符号数除以4 4SAR AXSAR AX, CL CL ;带符号数除以带符号数除以4 4使用移位指令作乘除法,要比用乘除指令快得多,比如使用移位指令作乘除法,要比用乘除指令快得多,比如实现实现AXAX乘乘1
68、010: MOV BXMOV BX,AX AX ;保存保存AXAX MOV CL MOV CL,2 2 ;移为两次(乘移为两次(乘4 4) ADD AXADD AX,BX BX ;加上原来的加上原来的AXAX SHL AX SHL AX,1 1 ;AXAX移位一次(实现乘移位一次(实现乘1010)三、循环指令8086/80888086/8088有四条循环指令:有四条循环指令: 循环左移指令循环左移指令 ROLROL dst dst,count,count 循环右移指令循环右移指令 RORROR dst dst,count,count 带进位位循环左移指令带进位位循环左移指令 RCL RCL d
69、stdst,count,count 带进位位循环右移指令带进位位循环右移指令 RCRRCR dst dst,count,count 前前两两条条指指令令未未把把标标志志位位CFCF包包括括在在循循环环的的环环中中,而而后后两两条条指指令令把把CFCF包包括括在在循循环环中中,作作为为整整循循环环的的一一部部分分。循循环环指指令令的的功功能如图能如图5.4.25.4.2所示。所示。 循循环环指指令令可可以以对对字字节节操操作作,也也可可以以对对字字操操作作。操操作作数数可可以以是是寄寄存存器器操操作作数数,也也可可以以是是内内存存操操作作数数。循循环环方方向向由由指指令令决决定定。循循环环移移动
70、动的的位位数数由由指指令令中中的的计计数数值值决决定定,计计数数值值可可以以是是1 1或存放在或存放在CLCL中的无符号数中的无符号数。第五节控制转移指令8086/8088 有四类转移指令:有四类转移指令: (1)转移指令,包括无条件转移和条件转移指令。转移指令,包括无条件转移和条件转移指令。 (2)重复控制指令重复控制指令 (3)调用和返回指令调用和返回指令 (4)中断指令中断指令 8086/8088 使使用用CS 段段寄寄存存器器和和IP 指指令令指指针针寄寄存存器器的的值值来来寻寻址址,以以取取指指令令来来执执行行 ,转转移移指指令令则则可可改改变变CS与与IP的的值值或或仅仅改改变变I
71、P 的的值值,使使得得改改变变指指令令执执行行的的顺顺序序,转转移移指指令令如表如表5.5.1所示指令中的所示指令中的 Target 表示转移的目标。表示转移的目标。 这这些些指指令令都都将将引引起起程程序序执执行行方方向向的的转转移移,不不过过转转移移又又段段内内转转移移和和段段间间转转移移之之分分,所所谓谓段段内内转转移移是是指指段段地地址址不不变变,只只是是IP改变,而段间转移则改变,而段间转移则CS和和IP均发生改变。均发生改变。一、转移指令转移指令分无条件转移和条件转移指令转移指令分无条件转移和条件转移指令1.无条件转移指令无条件转移指令无条件转移指令格式为:无条件转移指令格式为:
72、JMP TARGET JMP 转转移移指指令令分分直直接接转转移移和和间间接接转转移移,直直接接转转移移又又分分短短程程(SHORT),近近程程(NEAR)和和远远程程(FAR) 三三种种形形式式,当当程程序序中中执执行行到到JMP 指指令令时时,执执行行就就无无条条件件转转移移到到JMP所所指指的的目目标标(TARGET)去去,目目标标可可以以是是一一个个标标号号指指出出的的直直接接转转移移地地址址, 如如 : JMP SUM它它指指出出无无条条件件转转向向SUM 地地址址(是是段段内内转转移移)目目标标也也可可以以是是用用NEAR或或FAR 进行说明,例如:进行说明,例如: JMP FAR
73、 LABEL 说明说明LABEL 不在现行段内,则是段间转移。不在现行段内,则是段间转移。 如如果果目目标标与与JMP 指指令令的的距距离离在在-128到到+127个个字字节节之之间间,则则可可用用SHORT 来来说说明明 ,表表示示为为短短程程转转移移,这这种种格格式式,由由于于目目标标用用位位移移表表示示(一一个个字字节节),所所以以指指令令节节省省一一个个单单元元,若若是是目目标标用用地地址址表表示示,则则需需两两个个字字节节,当当目目标标前前不不用用NEAR说说明明时,隐含着时,隐含着NEAR型的段内转移。例如:型的段内转移。例如: JMP SHORT NEXT;短程转移短程转移 JM
74、P LOOPL ;近程转移近程转移JMP指指令令中中的的目目标标也也可可以以是是由由存存储储器器或或寄寄存存器器指指出出的的间间接接转转移地址,例如:移地址,例如: JMP TARGET BX;转移地址由转移地址由BX及及TARGET变变 ;址计算得到;址计算得到 JMP CX ;以以CX的内容位转移目的地的内容位转移目的地 ;址;址2.条件转移指令8086/8088有有18条条不不同同的的条条件件转转移移指指令令。它它是是根根据据标标志志寄寄存存器器的的标标志志位位决决定定程程序序是是否否进进行行转转移移,条条件件转转移移指指令令的的目目的的地地址址必必须须在在现现行行的的代代码码段段内内(
75、CS)中中,并并且且以以下下一一条条指指令令地地址址为为基基准准,必必须须在在+127到到-128的的位位移移范范围围内内,因因此此条条件件转转移移之之零零转转移移的的范范围围是是有有限限的的,而而不不像像JMP指指令令。条条件件转转移移指令如表指令如表5.5.1所列。所列。从从表表种种可可看看出出条条件件转转移移指指令令有有时时根根据据两两数数比比较较结结果果来来进进行行转转移移,有有时时指指明明测测试试某某些些标标志志未未来来决决定定转转移移,但但有有时时两两条条指令时实质上是一致的。如:指令时实质上是一致的。如:JE/JZ SUM;JE指指令令的的含含义义若若两两数数相相等等则则转转SU
76、M,而而JZ指令的含义是若标志位指令的含义是若标志位ZF=1则转则转SUM。使用条件转移指令时,经常在该指令之前用一条比较指使用条件转移指令时,经常在该指令之前用一条比较指令或减法指令,以建立标志位,然后由条件转移指令进行判令或减法指令,以建立标志位,然后由条件转移指令进行判断是否转移。断是否转移。条件转移指令由对带符号数比较或测试的指令,这常对条件转移指令由对带符号数比较或测试的指令,这常对溢出为溢出为OF或符号为或符号为SF及逆行测试,对无符号数则常测试及逆行测试,对无符号数则常测试CF,对带符号数由大于等于小于三种情况,无符号数则有高于对带符号数由大于等于小于三种情况,无符号数则有高于等
77、于低于三种情况。等于低于三种情况。二、重复控制指令8086/8088有有三三条条控控制制重重复复控控制制指指令令:LOOP、LOOPZ(LOOPE)、LOOPNZ(LOOPNE),还还有有一一条条通通常常用用于于循循环环控控制制的的条件转移指令条件转移指令JCXZ。1 1、LOOPLOOP、LOOPZLOOPZ、LOOPNZLOOPNZ指指令令2 2、JCXZ JCXZ 指令指令1、LOOP、LOOPZ、LOOPNZ指令这这类类指指令令用用于于控控制制程程序序的的循循环环,其其控控制制转转向向的的目目的的地地址址是是在在以以下下条条指指令令地地址址为为中中心心的的+127到到-128的的范范围
78、围内内,这这类类指指令令用用CX 作作计计数数器器,每每执执行行该该指指令令,CX便便减减1,直直到到减减为为0为止。为止。例例如如用用LOOP时时,规规定定循循环环次次数数放放在在CX中中,每每LOOP指指令令一一次次,则则CX减减1,若若CX不不等等于于0,则则转转向向目目的的地地址址执执行行,如如此此重重复复直直到到CX减减为为0为为止止,例例如如要要重重复复执执行行某某一一程程序序段段100次,可用下面的程序:次,可用下面的程序: MOV CX,100;100次输送次输送CX START: . . ;要执行要执行100次的程序段次的程序段 LOOP START ;CX0,转转START
79、执行执行 . . ;CX=0,往下执行往下执行在在循循环环过过程程中中,常常根根据据循循环环内内出出现现的的情情况况来来终终止止循循环环,若若相相等等则则循循环环,这这可可用用LOOP指指令令,若若不不相相等等则则循循环环,这这可可用用LOOPNE指指令令,前前者者,是是当当CX不不等等于于零零,ZF=1时时则则循循环环,后后者者是是CX不不等等于于零零 ZF=0时时则则循循环环。当当两两个个中中的的一一个个条条件件满满足一个不满足时,则终止循环。足一个不满足时,则终止循环。例例如如在在指指定定的的存存储储区区中中,找找第第一一个个非非零零字字节节 ,设设存存储储区区开开始始单单元元的的偏偏移
80、移地地址址在在BX中中,最最后后单单元元的的偏偏移移地地址址在在DI中中,若若找找到到非非零零字字节节,则则其其偏偏移移地地址址在在BX中中,若若没没找找到到则则BX与与DI相等,表示已找到最后单元。相等,表示已找到最后单元。 SUB DISUB DI,BX BX INC DI INC DI ;字节数字节数=(=(DI)-(BX)+1DI)-(BX)+1 MOV CX MOV CX,DI DI ;字节数送字节数送CX CX DEC BX DEC BX NEXTNEXT: INC BX INC BX CMP BYTEPTRBX CMP BYTEPTRBX,0 0 ;与与0 0比较比较 LOOPE
81、 NEXT LOOPE NEXT ;是是0 0,去比较下一个,去比较下一个 JNZ NZ_FOUND JNZ NZ_FOUND ;找到否,即找到否,即ZF=0?ZF=0? . . ;没找到没找到NZ_FOUNDNZ_FOUND: ;找到,找到, BXBX中为非零字节中为非零字节 .2、JCXZ 指令这这条条指指令令也也是是一一条条转转移移指指令令,它它的的转转移移条条件件是是CX=0。这这条条指指令令在在循循环环程程序序的的开开始始处处,为为了了能能跳跳过过循循环环(只只要要是是CX=0)是有用的。是有用的。三、调用和返回指令 CALL、RETCALL 指指令令用用来来调调用用一一个个过过程程
82、或或者者程程序序。当当调调用用的的过过程程或或子子程程序序结结束束后后,使使用用RET 指指令令返返回回,由由于于过过程程或或子子程程序序由由段段间间调调用用(即即远远程程FAR)和和段段内内调调用用(及及近近程程NEAR)所所以以CALL也也有有FAR和和NEAR之之分分,这这由由被被调调用用的的过过程程的的定定义义所所决决定,因此定,因此RET也有段间和段内返回两种。也有段间和段内返回两种。当当段段内内调调用用时时,首首先先将将IP内内容容入入栈栈。当当返返回回时时,从从站站内内取取出出一一个个字字并并放放回回到到IP中中,若若段段间间调调用用时时,则则先先把把CS入入栈栈,在在把把IP如
83、如战战,RET返返回回时时,在在从从栈栈中中去去回回一一个个字字放放入入IP中中,然后从栈中取第二个字放入然后从栈中取第二个字放入CS中,作为段间返回地址。中,作为段间返回地址。象象JMP指令一样指令一样CALL指令也有两种得到目标地址的办法:指令也有两种得到目标地址的办法:直接和间接。直接调用目标地址在直接和间接。直接调用目标地址在CALL指令中,间接调用指令中,间接调用目标地址在由指令指定的寄存器或内存单元中。目标地址在由指令指定的寄存器或内存单元中。四、中断指令8088提供三条中断传送操作指令:提供三条中断传送操作指令: 中断指令中断指令 INT n 溢出中断指令溢出中断指令 INTO
84、中断返回指令中断返回指令 IRET 在在8086/8088中中,程程序序的的执执行行控控制制可可以以采采用用软软中中断断的的方方式式。当当程程序序中中遇遇到到中中断断指指令令时时,中中止止现现行行程程序序,保保护护断断点点和和现场后,转去执行。现场后,转去执行。1、INT n指令这这条条指指令令启启动动在在指指令令中中的的中中断断类类型型号号(n)规规定定的的中中断断过过程程。8088采采取取向向量量中中断断,中中断断类类型型号号0255,规规定定了了256个个中中断断向向量量。每每个个中中断断向向量量包包括括了了四四个个字字节节的的中中断断程程序序的的入入口口地地址址。其其中中,有有两两个个
85、字字节节是是中中断断程程序序的的代代码码段段值值,另另两两个个字字节节是是中中断断程程序序入入口口地地址址偏偏移移量量。这这256个个入入口口地地址址组组成成一一个个表表叫叫中中断断向向量量表表,存存放放在在存存储储器器绝绝对对地地址址00000H到到003FFH中。中。关关于于8088中中断断系系统统的的介介绍绍请请参参阅阅第第七七章章,当当程程序序中中遇遇到到中中断断指指令令INT时时,便便中中断断程程序序的的执执行行,而而转转向向由由256个个中中断向量提供的地址之一去执行。例如:断向量提供的地址之一去执行。例如: INT 1AH此此时时程程序序将将转转向向IA型型中中断断服服务务程程序
86、序执执行行,此此时时中中断断向向量量地地址址为为41AH=68H,即即从从68H和和69H单单元元中中取取出出IP的的值值,从从6AH和和6BH取出取出CS的值,然后转向该地址执行中断服务程序。的值,然后转向该地址执行中断服务程序。2、INTO指令和IRET指令INTO指指令令可可以以写写在在一一条条算算数数指指令令的的后后面面,若若算算数数运运算算指指令令执执行行的的结结果果溢溢出出,及及溢溢出出标标志志OF=1,则则转转向向溢溢出出中中断断处理;否则不进行任何操作,接着执行下一条指令。处理;否则不进行任何操作,接着执行下一条指令。 IRET指令的作用是:当执行完中段服务程序后,返回主指令的
87、作用是:当执行完中段服务程序后,返回主程序。程序。第六节字符串指令存存储储器器中中存存放放的的一一串串字字或或字字节节,它它们们可可以以是是二二进进制制数数,也也可可以以是是BCD码码或或ASCII代代码码等等相相关关的的一一些些信信息息。它它们们存存放放在在连连续续区区域域中中,若若对对它它们们的的每每个个字字或或字字节节均均作作同同样样的的操操作作,就就称称为为串串操操作作。我我们们把把能能够够完完成成这这些些功功能能的的指指令令,称称为为字字符符串操作指令或简称为字串指令这些指令如表串操作指令或简称为字串指令这些指令如表5.6.1所列。所列。此此表表中中每每一一类类指指令令的的第第一一个
88、个均均带带有有操操作作数数,汇汇编编时时,汇汇编编程程序序均均将将其其转转换换为为后后面面中中的的一一个个(根根据据是是字字节节还还是是字字操操作),因此多使用后面的两种形式作),因此多使用后面的两种形式在在字字串串操操作作中中假假定定源源串串在在数数据据中中,目目的的串串在在附附加加段段中中,用用作作指指针针对对源源寻寻址址,用用作作指指针针骒骒目目的的串串寻寻址址,在在每每次次字字串串操操作作后后,若若是是字字节节操操作作,则则和和(或或)的的值值会会自自动动加加或或减减,若若是是字字操操作作,则则和和(或或)自自动动加加或或减减,是是加加还还是是减减由由标标志志寄寄存存器器的的方方向向标
89、标志志位位决决定定,若若:则则作作加加,否否则则,作作减减操操作作在在串串操操作作前前可可用指令来设置,用指令来清用指令来设置,用指令来清一、串操作指令有有五五种种基基本本的的串串操操作作指指令令:串串传传送送指令,串比较指令,串扫描指令,串装入指令和串存储指令。指令,串比较指令,串扫描指令,串装入指令和串存储指令。是是串串传传送送命命令令。它它将将把把当当前前数数据据串串中中用用指指出出的的源源串串的的一一个个字字节节或或一一个个字字传传送送到到用用指指针针指指向向的的附附加加段段目目的的地地址址去去,当当,则则、作减或减。、作减或减。是是串串比比较较命命令令。它它是是将将当当前前数数据据段
90、段由由指指针针指指出出的的字字节节或或字字当当前前附附加加段段指指出出的的字字节节或或字字进进行行比比较较,把把比比较较结结果果送送标标志志寄寄存存器器,而而不不影影响响两两个个操操作作数数。所所谓谓的的操操作作数数中中减减去去源源操操作作数数,因因此此两两者者对对标标志志位位的的影影响响将将是是不不同同的的,因因此此若若该该指指令令后后面面用用条条件件转转移移指令,则应和的不同指令,则应和的不同该该指指令令执执行行过过后后,也也将将使使、加加减减或或,这这根根据的值决定。据的值决定。是是字字串串扫扫描描指指令令。它它是是将将(字字节节串串操操作作)或或(字字串串操操作作)的的值值减减去去在在
91、附附加加段段中中由由寻寻址址的的目目标标串串的的字字节节或或字字,结结果果将将改改变变标标志志寄寄存存器器的的标标志志位位,但但不不改改变变操操作作数数的的原原始始值值,并并将将使使修修改指针,修改情况如上所述,由的值决定。改指针,修改情况如上所述,由的值决定。是是字字串串装装入入指指令令。它它将将由由寻寻址址的的源源串串字字节节或或字字装装入入到到累累加加器器或或中中去去,且且根根据据的的值值,修修改改的的值值,以以指指向向下下一一个个要要装装入入的字节或字。的字节或字。是是字字串串存存贮贮指指令令。它它是是将将(字字符符串串操操作作)或或X(字字串串操操作作)中中的的字字储储存存到到由由寻
92、寻址址的的附附加加段段中中去去,且且根根据据的的值值来来修修改改的的值。值。二、字符串指令的重复当当一一条条串串操操作作指指令令要要重重复复执执行行时时,可可以以指指令令前前加加前前缀缀,这些前缀是:这些前缀是: 重重复复,使使用用时时将将重重复复次次数数放放在在中中,这这样样当当指指令令执执行行每每重重复复一一次次,值值便便减减,直直到到减减到到目目前前为为止止为为止,便停止重复。止,便停止重复。是是相相等等时时重重复复不不相相等等时时重重复复,即即若若只只要要和和不不减减到到0 0,串串指指令令就就重重复复执执行行,这这两两条条前前缀缀有有两两个个等等价价的的名名字字/ /,效效果果同同前
93、。示例如下:前。示例如下:将将1024个字符串从个字符串从DATA-A数据区般到数据区般到DATA-B数据区数据区: MOV SI,OFFSET DATA-A ;DATA-A偏移地址送偏移地址送SI MOV DI,OFFSET DATA-B ;DATA-B的偏移地址送的偏移地址送DI MOV CX,1024 ;传送次数送传送次数送CX REP MOVS ;DATA-A,DATA-B 重复搬运重复搬运将当前数据段中的将当前数据段中的BLOCK1数据块搬到同一段中数据块搬到同一段中BLOCK2去去: PUSH DS POP ES ;使使ES=DS,即数据段和附加段为同一个。即数据段和附加段为同一个
94、。 LEA SI,BLOCK1 ;源串地址送源串地址送SI LEA DI,BLOCK2 ;目的串地址送目的串地址送DI MOV CX,0050H ;重复次数重复次数(80)送送CX CLD ;使使DF=0,SI.DI作加作加2操作操作 REP MOVSW ;重复执行重复执行,直到直到CX=0为止为止比比较较DESTDEST和和SOURCESOURCE中中的的500500个个字字节节, ,找找出出第第一一个个不不匹匹配配( (不不相相同同) )的字节的字节, ,如果找到如果找到, ,则将则将SOURCESOURCE中的这个数送到中的这个数送到ALAL中中: : CLDCLD LEA DI,ES:
95、DEST ;DEST LEA DI,ES:DEST ;DEST偏移地址送偏移地址送DIDI LEA SI,SOURCE ;SOURCE LEA SI,SOURCE ;SOURCE偏移地址送偏移地址送SISI MOV CX,500 ; MOV CX,500 ;重复次数送重复次数送CXCX REPE CMPB ; REPE CMPB ;重复比较不相等或重复比较不相等或CX=0CX=0停止比较停止比较 JCXZ MATCH ;JCXZ MATCH ;没找到转没找到转MATCHMATCH DEC SI ; DEC SI ;找到找到SISI,减减1,1,恢复到找到时地址恢复到找到时地址 MOV AL,S
96、I ;MOV AL,SI ;读到读到ALAL中中MATCH:MATCH: ; ;没找到,由此执行没找到,由此执行第七节处理器控制指令8086/8088处处 理理 器器控控制制指指令令用用于于修修改改标标志志寄寄存存器器,或或与与外外部部设设备备同同步步,以以及及用用来来控控制制处处理理器器与与协协处处理理器器之之间间的的相相互互作作用用。这类指令如表这类指令如表5.7.1所列。所列。一、标志位操作指令一、标志位操作指令二、外部同步指令二、外部同步指令一、标志位操作指令8086/8088有有七七条条直直接接对对单单独独的的标标志志进进行行操操作作的的指指令令。其其中中三三条条是是针针对对进进位位
97、标标志志CF,有有两两条条是是针针对对标标志志DF的的,有有两条是针对中断标志两条是针对中断标志IF的。的。标标志志位位操操作作指指令令用用于于改改变变档档志志位位的的状状态态,如如表表5.7.1中中操作说明所示。操作说明所示。二、外部同步指令8088有五条外部同步指令。有五条外部同步指令。 HLT是是暂暂停停指指令令,将将使使8088处处于于暂暂停停状状态态,只只有有再再重重新新启启动动或或有有一一个个外外部部中中断断发发生生时时,则则退退出出暂暂停停状状态态,常常用用HLT指令来等待中断的产生。指令来等待中断的产生。NOP是是空空操操作作指指令令,什什么么也也不不作作,但但执执行行却却需需
98、3个个时时钟钟周期,常用于延迟。周期,常用于延迟。WAIT是是等等待待指指令令,它它也也使使8088处处于于空空操操作作状状态态,但但每每隔隔5个个时时钟钟周周期期要要检检查查一一下下8088的的TEST线线,若若该该线线为为人人1,则则使使8088处处于于等等待待,直直到到TEST线线为为0止止,这这主主要要用用于于8088和协处理器及外部设备实现同步。和协处理器及外部设备实现同步。LOCK指令是一个前缀,可放在任何一条指令的前面,指令是一个前缀,可放在任何一条指令的前面,这条指令执行时锁存了总线的控制权,其它的处理器这条指令执行时锁存了总线的控制权,其它的处理器则得不到总线控制权,这个过程一直持续到指令执行完毕则得不到总线控制权,这个过程一直持续到指令执行完毕为止,它在多机系统中使用。为止,它在多机系统中使用。ESC指令是处理器交权指令。它可使协处理器从指令是处理器交权指令。它可使协处理器从8088的指令流中取出一部分指令,并在协处理器上执行。的指令流中取出一部分指令,并在协处理器上执行。