1、微机原理及其应用第3章指令系统,3.1 8086/8088的寻址方式,3.2 8086/8088指令系统,3.3 8086/8088指令系统的简单应用,目录,内容简介:8086/8088有关寻址的概念;7种基本的寻址方式及有效地址的计算。六大类指令的功能及各指令特点及使用方法。,第3章 指令系统,3.1 8086/8088的寻址方式,指令:指令是计算机执行各种操作的命令。一条指令对应着微处理器的一种基本操作。计算机为了完成不同的功能而要执行不同的指令。某一型号CPU能够识别和执行的全部指令称为该CPU的指令系统。 机器指令:计算机只能识别二进制码,所以指令系统中的全部指令都必须以二进制编码的形
2、式来表示,这种编码就是指令的机器码,或者称为机器指令。 指令的组成:一条机器指令是由操作码和操作数两部分组成,其中操作码表示计算机执行什么操作,操作数给出参加操作的数的本身或操作数所在的地址。 寻址方式: CPU可根据指令中给出的地址信息求出存放操作数的地址,称为有效地址EA,对存放在有效地址中的操作数进行存取操作,指令中关于如何求出存放操作数有效地址的方法称为操作数的寻址方式。,3.1.1 指令格式及操作数类型 1指令格式 一般汇编语言指令格式: 标号: 指令助记符 操作数1,操作数2;注释(方括号中的内容可选)。汇编语言的指令主要由操作码和操作数组成,其中操作码指出指令的功能,操作数代表指
3、令被处理的对象,其个数依指令需求而定。若需在指令后添加注释,应以分号开头。一条指令必须写在一行,每条指令后以回车键结束。 2操作数类型 按操作数在指令中的所起的作用,可以分为目的操作数和源操作数;按操作数的存储位置分,可以分为立即数操作数、寄存器操作数和存储器操作数。 (1)立即数操作数。立即数操作数就是在指令中直接给出常数,在汇编成机器码时这种操作数将作为指令代码的一部分出现在指令中。 (2)寄存器操作数。寄存器操作数是指以CPU寄存器中的内容作为操作数,其书写形式就是寄存器名。 (3)存储器操作数。存储器操作数将存储器中某些存储单元的内容作为指令的操作数,其书写形式是存储单元的逻辑地址。,
4、第3章 指令系统,3.1.2 8086指令系统的基本寻址方式8086指令系统的基本寻址方式就是操作数的寻址方式,是指寻找操作数存放地址的方法。8086的基本寻址方式共有七种。 1立即寻址方式 立即寻址方式所提供的操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分,这种操作数称为立即数。立即数可以是8位的,也可以是16位的。立即数只能作为源操作数,主要用来给寄存器或存储单元赋值。例1 MOV AL,20HMOV BX,1820H 指令执行情况如图3-1所示。执行结果为:AL = 20H,BX = 1820H。,第3章 指令系统,第3章 指令系统,2直接寻址方式 直接寻址方式的有效地址EA
5、在指令的操作码后面直接给出,它与指令的操作码一起,存放在存储器的代码段中。 例3,MOV AX,1000H;如果DS = 2000H,(21000H) = 32H,(21001H)= 45H, 如图3-2所示。 功能:是将一个有效地址是1000H的存储单元的内容传送到AX。设此时数据段寄存器DS=2000H,则该存储单元的物理地址为: PA=:2000H*16 + 1000H = 20000H + 1000H = 21000H指令执行结果为:AX = 4532H。,3寄存器寻址方式 寄存器寻址方式的操作数存放在指令规定的寄存器中,寄存器的名字在指令中指出。寄存器可以是16位的,如AX、BX 、
6、SI、SP等,也可以是8位的,如AH、AL、CL等。 例2 MOV DL,AL MOV AX,CX 如果AL = 30H,CX = 1002H,执行结果为:DL = 30H,AX = 1002H。由于大部分操作数存放在存储单元中。指令中寻找内存单元(称为内存寻址)采用逻辑地址。逻辑地址中,段基址相对变化较少,常在程序的首部把段基址送入段寄存器,后面的指令只需给出段内的偏移地址就可以了。偏移地址又称为有效地址EA,在指令中可以直接或间接给出存储单元的偏移地址,以达到存取存储器操作数的目的。8086指令系统提供了下述多种存储器寻址方式。,第3章 指令系统,第3章 指令系统,4寄存器间接寻址方式 这
7、种寻址方式的操作数本身在存储器中。寻找这个操作数之前,先把它的地址(偏移地址)放入一个16位寄存器中,指令中指出存放地址的这个寄存器。所以称为寄存器间接寻址方式。可用于间接寻址的寄存器有:BX、SI、DI和BP。,(1)若选择BX、SI、DI寄存器间接寻址,则存放操作数的段寄存器默认为DS,操作数的物理地址为:DS 16 + (BX、SI、DI) (2)若选择BP寄存器间接寻址,则对应的段寄存器应为SS,即操作数的物理地址为:SS 16 + BP,例4 MOV AX, SI 如果DS = 2000H,SI = 1000H,指令执行情况如图3-3所示。执行结果为:AX= 3240H。,5寄存器相
8、对寻址方式 这种寻址方式的有效地址EA由二部分组成:一个寄存器的内容为基地址,另一是指令中给定的8位或16位位移量。可用作寄存器相对寻址方式的寄存器有BX、SI、DI和BP。 (1)若选择BX、SI、DI寄存器相对寻址,存放操作数的段寄存器默认为DS。即操作数的物理地址为:DS16 + (BX/SI/DI)+(disp8/disp16) disp8/disp16表示指令内给出的8位16位位移量。,第3章 指令系统,(2)若选择BP寄存器相对寻址,则对应的段寄存器应为SS。操作数的物理地址为:SS 16+BP+(disp8/disp16) 例5 MOV AX,SI+10H如果DS = 3000H
9、,SI = 2000H ,(32010H) = 56H,(32011H)= 12H,则指令执行情况如图3-4所示。执行结果为:AX = 1256H。,6基址变址寻址方式 这种寻址方式的有效地址EA是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和。 (1)若用BX作为基地址,则操作数在数据段中。 操作数的物理地址为:DS16 +BX+ (SI/DI) (2)若用BP作为基地址,则操作数在堆栈段中。 操作数的物理地址为:SS16 +BP+ (SI/DI)如:MOV AX,BPSI,第3章 指令系统,7基址变址相对寻址方式 这种寻址方式的有效地址EA是一个基址寄存器内容和一个变
10、址寄存器内容与由指令中指定的8位或16位位移量之和。,(1)若用BX作为基地址,则操作数在数据段中。即操作数的物理地址为: DS16 +BX+ (SI/DI)+(disp8/disp16) (2)若用BP作为基地址,则操作数在堆栈段中。即操作数的物理地址为: SS16+BP+(SI/DI)+(disp8/disp16) 例6 MOV AX,BX+SI+4500H 若DS = 3000H,BX = 2000H,SI = 1000H,(37500H)= 56H,(37501H)= 12H,指令执行情况如图3-5所示, 执行结果为:AX = 1256H。,基址加变址相对寻址方式表示形式,其中COUN
11、T为偏移量。 MOV AX,BX+SI+COUNT MOV AX,COUNT BX SI MOV AX,BX +COUNT SI MOV AX,BX COUNT SI MOV AX,BX+SI COUNT,第3章 指令系统,8隐含寻址 将操作数的地址隐含在指令操作码中的寻址方式就称为隐含寻址。注意:上述8种寻址方式中,除立即寻址和寄存器寻址外,其它5种寻址方式的操作数都是通过访问存储器取得,对这5种寻址方式的段寄存器的使用情况如下: (1)若不指出段基址,80868088会采用默认的段寄存器。规则为:偏移量表达式出现BP则使用SS;否则使用DS。 (2)可以用“段寄存器名:”的形式指出段基址,
12、此时默认规则不再起作用。如:“MOV AX,DS:BP”中段基址采用DS值,而不是默认的SS的值。在这里将“DS:”称为段超越或段前缀,它超越了默认的访问段。,第3章 指令系统,3.1.2 决定转移地址的寻找方式 CPU执行程序的顺序是由代码段寄存器CS和指令指针IP(EIP)的内容所确定的。指令指针IP(EIP)具有自动加1的功能,每当BIU取完一条指令以后,IP(EIP)的内容自动加1指向下一条指令,以便使程序按照指令存放的次序由低地址到高地址依次执行。当程序中有跳转指令时,就需要改变以上顺序执行的过程,而按照指令的要求修改IP(EIP)的内容或同时修改IP(EIP)和CS的内容,从而将C
13、PU引导到指令所规定的地址去执行。程序转移地址的寻址方式,寻找的是程序转移的目标地址,而不是操作数,在8086(8088)微机系统中,由于存储器采用了分段结构,所以对转移地址的寻址方式分为段内寻址和段间寻址两类。下面介绍四种与转移地址有关的寻址方式。,1段内直接寻址方式段内直接寻址也称为相对寻址方式。转向的有效地址是当前IP内容和指令指定的8位或16位位移量之和,当位移量是8位时,称为短程转移,常在转向的符号地址前加操作符SHORT。当位移量是16位时,称为近程转移,常在转向的符号地址前加操作符NEAR PTR。 例如:JMP SHORT LOOP1JMP NEAR PTR LOOP2其中:L
14、OOP1和LOOP2均为程序转向的符号地址,SHORT表示地址位移量DISP为8位带符号数。2段内间接寻址方式段内间接寻址方式的特点是程序转向的有效地址存放在寄,存器或存储单元中。指令执行时,可用寄存器或存储单元中的内容去更新指令指针IP的值,从而正确地实现程序转移,例如:JMP BXJMP WORD PTRSI2000H其中:WORDPTR是一个操作符,说明跟在其后的存储器操作数所取得的转向地址是一个字类型的有效地址,从而表明这种寻址方式是一种段内转移。以上两种寻址方式均为段内寻址,由于转向的目标地址与跳转指令同在一个代码段,所以CS的内容不需修改,仅需修改指令指针IP的内容,根据指令的寻址
15、方式求得转向的有效地址EA并送到IP寄存器就可以了。转向的物理地址计算公式为:物理地址(CS)16IP 3段间直接寻址方式段间直接寻址方式的特点是在跳转指令中直接给出了转向的段基址和偏移地址,16位的段基址用来更新CS,16位的,偏移地址用来更新IP,从而完成了从一个段到另一段的转移。在这种寻址方式的指令中,常在转向的符号地址前加上操作符FAR PTR例:JMP FAR PTR LOOP3 ; LOOP3为转向的符号地址。 4段间间接寻址方式段间间接寻址方式的特点是由指令寻址方式确定的连续两个字的内容来取代IP和CS寄存器中的原有内容,低位字单元中的16位数据作为转向的偏移地址用以取代IP的内
16、容,高位字单元中的16位数据作为段基址用以取代CS,从而实现段间程序转移例:JMP DWORD PTRBX其中,DWORDPTR为双字操作符,说明后面紧跟的存储器操作数所取得的转向地址是一个双字的有效地址。以上两种寻址方式均为段间寻址,跳转指令和转向地址分别在两个不同的代码段,所以既需要修改IP的内容,又需要修改CS的内容,这样才能实现段间转移。,8086/8088的指令大致可分成以下六种:数据传送、算术运算、位操作、串操作、程序控制和处理器控制指令。 3.2.1 传送指令传送指令是将数据、地址或立即数传送到寄存器或存储单元中。这类指令不影响状态标志位,只有两条涉及标志寄存器FLAGS的指令(
17、SAHF和POPF)例外。,第3章 指令系统,3.2 8086/8088指令系统,1通用数据传送指令 (1)数据传送指令 格式: MOV OPD,OPS 操作: OPD OPS 说明: MOV指令将源操作数OPS的内容传送到目的地OPD。指令执行后OPD与OPS的内容相等,即OPD = OPS,源操作数本身不变。,操作数类型: 1)OPS可以为:存储器、通用寄存器、段寄存器和立即数。 2)OPD可以为:存储器、通用寄存器和段寄存器(CS除外)。 注意: 1)立即数不能送段寄存器,其余可以任意搭配;立即数送存储器的指令有时难以确定操作数的长度,需要在存储器操作数的前面加上类型说明BYTE PTR
18、或WORD PTR。 例如:MOV BYTE PTRSI+10H,30 ;8位立即数30送偏移地址为SI+10H的字节单元;MOV WORD PTRBX+DI,2 ;16位立即数2送偏移地址为BX+DI的字单元。 2)两存储单元之间不能直接进行数据传送;两个段寄存器之间不能直接进行传送信息。但可以用CPU内部寄存器为桥梁来完成这样的传送。 例如:MOV AL,AREAl 例如: MOV AX,1000HMOV AREA2,AL MOV DS, AX 3)指令 MOV X ,0,若X已经规定了它的类型为存储器操作数,X表示符号地址属直接寻址可以不加方括号。指令MOV X,0等同于 MOV X,0
19、 。,第3章 指令系统,数据传送指令如下: 立即数送寄存器 MOV AL,10H MOV BX,2100H 寄存器之间传送 MOV DX,CX MOV AH,DL MOV DS,AX MOV DX,ES 通用寄存器与存储器之间传送 MOV AX,1000H MOV BP,DX 段寄存器与存储器之间传送 MOV BXDI,ES MOV DS,10BP+DI,例8 指出下列数据传送指令中的错误。 MOV 10H,AX ;立即数不能作为目的操作数 MOV DS,2000;立即数不能送段寄存器 MOV CS,AX;CS不能作为目的操作数 MOV DS,ES;目的操作数和源操作数不能同时为段寄存器 MO
20、V DI,SI;目的操作数和源操作数不能同时为存储器 MOV AL,BX;类型不匹配,AL为8位、BX为16位寄存器 MOV DL,300 ;类型不匹配,DL为8位寄存器,300超过1B,第3章 指令系统,例:MOV AL, 30H ; 寄存器立即数,字节传送 MOV AX, 1122H ; 寄存器立即数,字传送 MOV BH, CH ; 寄存器寄存器,字节传送 MOV SI, BX ; 寄存器寄存器,字传送 MOV CL, ADDR ; CL内存单元ADDR中的字节内容 MOV AX, DI ; AX由DI间接寻址确定的内存单元中的字内容 MOV SI , DX ; SIDX的内容,SI指定
21、内存单元的字地址 MOV 2000H , DS ;2000HDS的内容 ; 2000H指定内存单元的字地址 MOV SS, AX ; 段寄存器寄存器,字传送还应注意,CS和IP这两个寄存器不能作为目标操作数,即表明,这两个寄存器的值是不能用MOV指令来修改的。另外,当操作数采用BX, SI, DI来间接寻址时,默认的段寄存器为DS,访问数据段。当采用BP来间接寻址时,默认的段寄存器为SS,访问堆栈段。,例1、分析下列程序段的运行结果 MOV AL, 00H MOV BL, 01H MOV CL, 02H MOV BL, AL MOV CL, BL该程序段的功能是将AL, BL和CL寄存器清0。
22、例2、MOV AX, 5060H MOV 2100H, AX指出执行这两条指令组成的程序段后,相应存储单元中的内容是什么?第一条指令的执行结果是AX5060H,第二条指令将AX中的内容传送到内存中偏移地址为2100H的字单元中,所以:2100H60H2101H50H,(2)堆栈操作指令。堆栈是内存中的一个特定的区域,用于暂存数据或断点地址,当这个段被指定为堆栈后,可用堆栈操作指令对它进行特殊规则的访问。由段寄存器SS确定堆栈段的段基址,由它可定位堆栈段的起始位置;用SP指示栈顶单元的段内偏移量,开始时堆栈内没有数据,栈顶就是栈底,故开始时要将栈底单元的偏移量赋给它,以指明栈底位置。堆栈的形态如
23、图3-7所示。对堆栈的操作有建栈、入栈和出栈三种,堆栈指令有入栈和出栈两种。,第3章 指令系统,例 将物理地址为10000H13000H的内存区域设置为堆栈段。 解:只须将SS1000H,SP3000H即可,可用下述指令: MOV AX,1000H MOV SS,AX MOV SP,3000H ,1)入栈指令 格式:PUSH OPS 操作:SP SP-2,SP+1 SP OPS 操作数类型: OPS源操作数,表示入栈的字操作数,除了不允许使用立即数外,寄存器、存储器、段寄存器(CS除外)都可以作为源操作数。说明:PUSH指令先将SP的内容减2,然后再将操作数OPS的内容送入由SP指出的栈顶即偏
24、移地址为SP和SP+1的两个连续字节中。 例 PUSH AX ;通用寄存器内容入栈PUSH CS ;段寄存器内容入栈PUSH SI ;字存储单元内容入栈,第3章 指令系统,具体操作过程是:先把SP减1,将操作数的高位字节送入当前SP所指单元中,然后再将SP减1,将操作数的低位字节又送入当前SP所指单元中。也就是说,每执行一次PUSH操作,将源操作数s指定的一个字数据压入堆栈中由SP指定的相邻两个单元保存起来,数据的高位字节压入高地址单元,低位字节压入低地址单元(即高位对应高地址,低位对应低地址)。堆栈指针SP减2,SP总是指向最后压入数据的单元地址,即栈顶。,例:PUSH AX指令执行前SS4
25、000H,SP2500H,AX3125H,指令执行过程及堆栈操作如图指令执行时,首先SP减1,则SP24FFH,将AX的高位字节AH31H送入SP和SS所指定的424FFH单元中,然后将SP再减1,此时SP24FEH,将AX的低位字节AL25H送入SP和SS所指定的424FEH单元中。执行完PUSH指令,SP24FEH,在原来SP2500H的基础上减少2。,2)出栈指令 格式:POP OPD 操作:OPD SP+1 SP,SP SP+2 操作数类型:OPD可以是存储器、通用寄存器或段寄存器(但不能是CS),同样,不能是立即数。 说明:POP指令先将堆栈指针SP所指示的栈顶存储单元的值弹出到操作
26、数OPD中,然后再将SP的内容加2。入栈和出栈操作如图所示。,第3章 指令系统,具体操作过程是:先将当前SP所指的栈顶单元的内容弹出送入d指定的低位字节单元,SP内容加1指向下一个单元,然后再将当前SP所指栈顶单元中的内容弹出送入d指定的高位字节单元,SP的内容再加1。也就是说,每执行一次POP操作,由当前SP所指的栈顶字单元中弹出一个字数据送入d指定的目标操作数,高位对应高地址,低位对应低地址。堆栈指针SP加2,SP总是指向下一个该弹出数据的单元地址,即栈顶。,例 POP BX指令执行前,SS8000H,SP2000H,堆栈区段偏移地址为2000H单元中的内容为0BH,2001H单元中的内容
27、为0AH。指令执行时,首先将SP2000H所指栈顶地址单元中的内容0BH弹出来送入BX的低位字节BL中,然后SP加1为2001H,再将当前SP所指栈顶地址单元中的内容0AH弹出来送入BX的高位字节BH中,最后再将SP加1,指向2002H单元,SP在原来2000H的基础上增加2。指令执行后,BX0A0BH,SP2002H。,堆栈操作在计算机中常常被用来保护现场。如果在程序中要用到某些寄存器,但它们原来的内容在后面程序执行过程中还要用到,这时就可用压入堆栈指令将这些寄存器的内容暂时保存在堆栈中,以后要用到这些内容时,又可用堆栈弹出指令恢复。其程序形式如下:PUSH AX ; 将AX的内容压入堆栈保
28、护PUSH BX ; 将BX的内容压入堆栈保护 ;在此程序段中可使用AX, BXPOP BX ; 恢复BX原先的内容POP AX ; 恢复AX原先的内容此时,要遵循堆栈操作“先进后出”的原则,特别注意有关内容的入栈及出栈顺序,防止造成数据的交叉或混乱。,在实际使用时,还可利用堆栈操作将某些寄存器或存储单元内容进行交换。例 分析下列程序段的执行情况。MOV SP, 3000H ; 设置堆栈的底部,SP=3000HMOV AX, 1234H ; 设置AX初始值,AX=1234HMOV BX, 5678H ; 设置BX初值,BX=5678HPUSH AXPUSH BX ; 将AX, BX内容压入堆栈
29、POP AXPOP BX ; 由堆栈弹出数据送入AX, BX中,分析: 堆栈指针SP的变化情况。由于每执行一条PUSH指令SP2,而每执行一条POP指令SP2,所以SP3000H22223000H。 AX,BX寄存器中的内容变化情况。当进行压入操作时,先压入AX的内容,后压入BX的内容。而当进行弹出操作时,最先弹出的内容(原BX的内容)送入AX,最后弹出的内容(原AX的内容)送入BX。由于堆栈操作先进后出的原则,导致AX和BX的内容发生了交换。,(3)数据交换指令 格式:XCHG OPD,OPS 操作:OPD OPS 操作数类型:OPD、OPS可以是寄存器或存储器,但不能二者同时为存储器。 说
30、明:XCHG指令将两个操作数内容进行交换。交换的内容可以是一个字节(8位),也可以是一个字(16位), 两个操作数的长度必须一致。即可以在寄存器与寄存器之间,或寄存器与存储器之间进行交换。段寄存器不能参加交换。 例 XCHG AL,CL ;8位寄存器间内容交换XCHG AX,DX ;16位寄存器间内容交换XCHG BX,DATASI ;寄存器与存储单元间内容交换,第3章 指令系统,例 内存数据段中存放有一张16进制数字的ASCII码表(图3-9),其首地址为HTABLE,为了将运算结果转换成ASCII码输出,可用下列程序实现一位十六进制数(4位二进制数)向ASCII码的转换: MOV BX,O
31、FFSET HTABLE;BX表首址 MOV AL,N;AL欲转换的数N XLAT HTABLE;查表转换 HLT,(4)字节转换指令(换码指令) 格式1:XLAT 格式2:XLAT OPS-table 操作: AL BX+AL 操作数类型:格式1隐含指令的操作数;格式2中操作数OPS-table,为表格的首地址(一般为符号地址),如表3-9中的HTABLE。 说明:XLAT指令完成将一种代码转换成另一种代码。 具体操作为:执行前必须已在内存中预先建立一个换码表,并将表的首地址存入BX寄存器,然后把要被查的表元素序号存放在AL中。XLAT指令是将BX和AL的内容相加后作为偏移地址,取出该存储单
32、元的内容送AL。,第3章 指令系统,2输入输出指令 输入输出指令完成外设与CPU之间的数据传送。输入指令IN用于从外设端口接收数据,输出指令OUT则向端口发送数据。输入输出指令对I/O端口的寻址方式可以分为两大类: 直接寻址 端口地址直接在指令中给出,可寻址256个端口(0255); DX寄存器间接寻址 将DX的内容作为端口地址,可寻址64KB个端口(065535)。,(1)输入指令 格式:IN AL/AX,PORT 操作:AL/AX (PORT) 操作数类型:AL/AX为8位16位累加器,PORT为I/O端口地址。 说明:从指定端口PORT将8位或16位数据读入AL或AX中,端口PORT的寻
33、址可用上述两种方式。,例 IN AL,10H;AL(10H)IN AX,20H;AX(21H,20H)IN AL,DX;AL(DX),DX作为8位端口寄存器IN AX,DX;AL(DX1,DX), DX作为16位端口寄存器,第3章 指令系统,(2)输出指令 格式:OUT PORT,AL/AX 操作:(PORT) AL/AX 操作数类型:同输入指令 说明:将累加器AL(8位)或AX(16位)的内容输出到指令指定的 I/O端口中,端口PORT的寻址可用上述两种方式。 注意:输入输出指令不影响标志位;使用DX寄存器间接寻址时,在执行输入输出指令前要将端口地址送入DX。 例 OUT 40H,AL ;
34、(40H)AL OUT 20H,AX ; (21H,20H AX) OUT DX,AL; (DX)AL OUT DX,AX; (DX1,DX)AX,第3章 指令系统,3地址传送指令 8086/8088CPU提供了三条把地址写入寄存器的指令,它们可以用来写入16位的近地址指针和32位的远地址指针。 (1)有效地址送寄存器指令 格式:LEA REG ,OPS 操作数类型:OPS为存储器操作数,REG为16位通用寄存器。 说明:将源操作数OPS的有效地址即16位偏移地址装入到16位通用寄存器REG中,这条指令常用来使一个寄存器作为地址指针。,例16 设DS = 3000H,BX = 2000H,SI
35、 = 1000H,指令LEA AX,BX+SI+1000H执行的结果是:AX = BX + SI + 1000H = 4000H,执行过程如图所示。 区别:MOV AX,BX+SI+1000H指令是将偏移地址为BX + SI + 1000H的内存单元的内容送到AX中,结果是AX=1256H。,第3章 指令系统,例17 LDS SI,0100H 设:原来DS=3000H,而有关单元的内容(30100H) = 60H,(30101H) = 05H,(30102H)=18H,(30103H)=20H,上述指令执行后,SI = 0560H,DS = 2018H,执行过程如图3-11所示。 (3)地址指
36、针装入ES指令 格式:LES REG,OPS 操作数类型:OPS为存储器操作数,REG为16位通用寄存器。,(2)地址指针装入DS指令 格式:LDS REG,OPS 操作数类型:OPS为存储器操作数,REG为16位通用寄存器。 说明:将OPS指定的内存中读取双字(四个连续)存储单元内容,将其中的低字(前两个单元)的内容赋给REG,高字(后两个单元)内容传赋给DS。,说明:将OPS指定的内存中读取双字(四个连续)存储单元内容,将其中的低字(前两个单元)的内容赋给REG,高字(后两个单元)内容传赋给ES。,第3章 指令系统,(1)标志传送指令 指令格式及操作: LAHF ;AH FLAGS的低8位
37、SAHF ;FLAGS的低8位 AH 说明:LAHF和SAHF指令隐含的操作数为AH寄存器和标志寄存器FLAGS的低半字节。涉及标志寄存器FLAGS中的5个状态标志位为SF、ZF、AF、PF以及CF。,(2)标志入、出栈指令 指令格式及操作:PUSHF ;SP SP-2,SP+1SP FLAGSPOPF ;FLAGS SP+1SP,SP SP+2 这两条指令可以用来修改标志寄存器中标志位的值。,第3章 指令系统,第3章 指令系统,5符号扩展指令 (1)字节扩展指令 格式:CBW 操作:把AL中的符号扩展到AH。如果AL80H,则AH00H,否则AH0FFH。 (2)字扩展指令 格式:CWD 操
38、作:把AX的符号扩展到DX。如果AX8000H,则DX0000H,否则DX0FFFFH。 注意:上述两条指令仅限于将扩展数放在AL或AX中进行。 例29 若AL = 100,BL = 15,试编写程序段,求出AL除以BL的商和余数分别存放在DL和DH中。 解:程序如下:CBW ;字节扩展到字DIV BL ;除法MOV DL,AL ;存商MOV DH,AH ;存余数HLT,第3章 指令系统,3.2.2 算术运算指令8086/8088的算术运算指令包括加、减、乘、除指令。参与运算的数据:是8位或16位可以是无符号;带符号的二进制数(则用补码表示);无符号压缩十进制(压缩型BCD码)数;非压缩十进制
39、(非压缩型BCD码)数。十进制数是以压缩或非压缩十进制字节的形式存储。 8086/8088提供了各种调整指令,可方便地进行压缩或非压缩十进制数的算术运算。 压缩BCD码:每个字节存两位十进制数,即两位BCD码。如56表示为压缩的BCD码形式为:01010110。 非压缩BCD码:每个字节存一位十进制数,即由一字节的低4位存放一位BCD码,高4位为0。如56表示为非压缩BCD码形式为:0000010100000110 。算术运算指令除符号扩展指令(CBW,CWD)外,其余指令都影响标志位,用来指示运算结果的状态。其后的条件转移指令通过测试这些标志位可以改变程序的流向。,1加法指令 (1)加法指令
40、 格式:ADD OPD,OPS 操作:OPD OPD + OPS 说明:ADD指令将OPD与OPS相加,并将结果存回OPD。加法指令影响全部6个状态标志位。 操作数类型:OPD可以是寄存器或存储器,OPS可以是寄存器、存储器或立即数。但是OPS和OPD不能同时为存储器。另外,OPD、OPS不能为段寄存器。(段寄存器不能参加、减、乘、除运算)。具体操作数组合见表3-1,适合加、减、乘、除运算。,表3-1加、减、乘、除运算操作数类型组合,第3章 指令系统,例 ADD AL,20;累加器内容与立即数相加 ADD DX,SI;寄存器内容相加 ADD AX,BX;寄存器与存储器内容相加 ADD DATA
41、DI,AL ADD BYTE PTRBPSI,50H ;存储器内容与立即数相加,第3章 指令系统,(2)带进位加法指令 格式:ADC OPD,OPS 操作:OPD OPD + OPS + CF 说明:ADC指令与ADD指令有些相似,但是它将OPD与OPS相加时,同时还要加上进位标志CF的内容,然后将结果送回OPD。ADC指令也将根据运算结果修改状态标志位。带进位加法指令主要用于数据位数较长、需要分段运算的加法运算。在进行多字加法运算时,低位字用ADD指令相加,高位用ADC指令相加,以接受低位产生的进位。,【例】 ADD AL, BL 指令执行前,AL66H,BL20H。 指令执行: 指令执行后
42、,AL86H,BL20H。 影响标志位的情况:CF0,ZF0,SF1,AF0OF1,PF0。,【例】 ADD WORD PTRBX+106BH,1234H ; WORD PTR指明存储器操作数为字类型若 DS2000H,BX1200H,字操作数存储单元的物理地址为: 物理地址20000H1200H106BH2226BH 指令执行前,(2226BH)44H,(2226CH)33H。 指令执行: 指令执行后, (2226BH)78H,(2226CH)45H。 影响标志位的情况:CF0,ZF0,SF0,AF0OF0,PF0。,【例】 下列指令序列完成两个无符号的双字数据的加法。假设目标操作数(被加数
43、)存放在DX和AX寄存器中,其中DX存放高位字,AX存放低位字。源操作数(加数)存放在BX和CX寄存器中,其中BX存放高位字,CX存放低位字。 指令执行前:DX0002H,AXF365H,BX0005H,CXE024H 应完成的操作:0002F365H0005E024H。 双字加法指令序列为: ADD AX, CX ; 低位字相加 ADC DX, BX ; 高位字带进位相加,执行第一条指令 第一条指令执行后,AXD389H,CF1,ZF0,SF1AF0,OF0,PF1。 执行第二条指令:第二条指令执行后,DX0008H,CF0,ZF0,SF0AF0,OF0,PF0。 该指令序列执行完后,相加的
44、和存放在DX, AX中,DX0008H, AXD389H,结果正确。,例 计算两个四字节长整数之和,数NA = 7A546C08H,NB = 12F0497DH,求NA+NB。运算程序如下: 分析:这是两个32位二进制数的加法,ADD指令一次只能完成两个16位二进制数的加法,32位数的加法要分两次进行:用ADD指令先加低16位,低16位产生的CF值,通过高16位ADC指令加进去,以保证结果的正确。 解: MOV BX,6C08H ;取加数的低字ADD BX,497DH ;和另一个加数的相应字相加MOV AX,7A54H ;取加数的高字ADC AX,12F0H ;和另一个加数的相应字相加上述程序
45、段的运行结果:AX中为和的高字,BX中为和的低字。,第3章 指令系统,(3)加1指令 格式:INC OPD 操作:OPD OPD + 1 说明:INC指令将OPD加1。该指令将影响状态标志位,如SF、ZF、AF、PF和OF,但对进位标志CF没有影响。 注意:INC指令中OPD可以是寄存器或存储器,但不能是段寄存器和立即数。INC指令常常用于循环程序中修改地址或者进行加法计数。 例 INC SI ;将SI寄存器内容加1 INC BYTE PTRBX ;将存储器字节单元BX内容加1 INC WORD PTRSI ;将存储器字单元SI内容加1 指令中的BYTE PTR或WORD PTR分别指定随后的
46、存储器操作数的类型。,第3章 指令系统,2减法指令 减法指令包括不带借位减法指令、带借位减法指令、减1指令、求补指令和比较指令,共五条指令。 (1)减法指令 格式:SUB OPD ,OPS 操作:OPD OPD - OPS 说明:SUB指令用OPD减去OPS,结果送回OPD。SUB指令对状态标志位有影响。对操作数类型组合的要求与加法指令相同。可以是字操作,也可以是字节操作。 【例】 SUB AL, BP+8 若SS5000H,BP2000H,则源操作数存储单元的物理地址为:物理地址SS16BP850000H2000H852008H 指令执行前,AL45H,(52008H)87H。 指令执行:
47、指令执行后:ALBEH,(52008H)87H。 置标志位的情况:CF1,ZF0,SF1,AF1,OF1,PF1。,第3章 指令系统,(2)带借位减法指令 格式:SBB OPD ,OPS 操作:OPD OPD OPS CF 说明:SBB指令将OPD减去OPS,同时减进位标志CF,并将结果送回OPD。该指令主要用于多字节数的分段减法。SBB指令对标志 位的影响与SUB指令相同。SBB指令中操作数的类型组合也与SUB指令相同。 【例】下列指令序列完成两个无符号的(双字数据)的减法。设目标操作数(被减数)存放在DX和AX寄存器中,其中DX存放高位字,AX存放低位字。源操作数(减数)存放在CX和BX寄
48、存器 中,其中CX存放高位字,BX存放低位字。指令执行前,DX0012H, AX7546H, CX0010H ,BX9428H则应完成00127546H00109428H的减法过程。双字减法指令序列为: SUB AX, BX ; 低位字相减 SBB DX, CX ; 高位字带借位CF相减,执行第一条指令: 第一条指令执行后,AXE11EH, CF1, ZF0, SF1, AF1, OF1, PF1。 执行第二条指令: 第二条指令执行后DX0001H, CF0, ZF0, SF0, AF0, OF0, PF0。 该指令序列执行完后,相减的差存放在DX, AX中, DX0001H, AXE11EH
49、,结果正确。,第3章 指令系统,(3)减1指令 格式:DEC OPD 操作:OPD OPD - 1 说明:DEC指令使OPD减1。指令对状态标志位SF、ZF、AF、PF和OF有影响,但不影响进位标志CF。 例25 DEC CX ;寄存器内容减1DEC BYTE PTRDI ;存储单元内容减1 (4)求补指令 格式:NEG OPD 操作:OPD 0 - OPD 说明:NEG指令使操作数求补,即用“0”减去OPD,结果送回OPD。求补指令对状态标志位有影响。其操作数可以是寄存器或存储器。 例26 NEG AXNEG WORD PTR DI+20利用NEG指令可以由一个数的补码得到它相反数的补码,如果这个数是负数,那么,就得到它的绝对值。,