微型计算机原理王忠民版PPT电子课件教案第4章80x86指令系统.ppt

上传人:田海滨 文档编号:89240 上传时间:2025-07-10 格式:PPT 页数:305 大小:3.21MB
下载 相关 举报
微型计算机原理王忠民版PPT电子课件教案第4章80x86指令系统.ppt_第1页
第1页 / 共305页
微型计算机原理王忠民版PPT电子课件教案第4章80x86指令系统.ppt_第2页
第2页 / 共305页
微型计算机原理王忠民版PPT电子课件教案第4章80x86指令系统.ppt_第3页
第3页 / 共305页
微型计算机原理王忠民版PPT电子课件教案第4章80x86指令系统.ppt_第4页
第4页 / 共305页
微型计算机原理王忠民版PPT电子课件教案第4章80x86指令系统.ppt_第5页
第5页 / 共305页
点击查看更多>>
资源描述

1、第4章 80 x86指令系统 第4章 80 x86指令系统 4.1 8086/8088指令系统指令系统 4.2 80 x86/Pentium指令系统指令系统 第4章 80 x86指令系统 4.1 8086/8088指令系统指令系统 4.1.1 8086/8088指令格式指令格式 用汇编语言编写的汇编语言程序输入计算机后,必须由“汇编程序”将它翻译成由机器指令(指令码)组成的机器语言程序,才能由计算机识别并执行。因此汇编语言程序需由汇编程序翻译成可执行的机器语言程序,一般来说,这一过程不必由人来干预。我们这里只介绍一下基本原理,以便在必要时也可以手工完成类似的工作。第4章 80 x86指令系统

2、8086/8088指令系统的指令类型较多,功能很强。各种指令由于功能不同,需要指令码提供的信息也不同。为了满足不同功能的要求又要尽量减少指令所占的空间,8086/8088指令系统采用了一种灵活的、由16个字节组成的变字长的指令格式,包括操作码、寻址方式以及操作数三个部分,如图4.1所示。通常指令的第一字节为操作码字节(OPCODE),规定指令的操作类型;第二字节为寻址方式字节(MOD),规定操作数的寻址方式;接着以后的36字节依据指令的不同而取舍,可变字长的指令主要体现在这里,一般由它指出存储器操作数地址的位移量或立即数。第4章 80 x86指令系统 图4.1 8086/8088不同字长的指令

3、码格式 第4章 80 x86指令系统 操作码操作码/寻址方式字节格式如下:寻址方式字节格式如下:第一字节中,指示操作数类型:W=0为字节,W=1为字;D指示操作数的传送方向:D=0表示寄存器操作数为源操作数,D=1表示寄存器操作数为目的操作数。第二字节指出所用的两个操作数存放的位置,以及存储器中操作数偏移地址的计算方法。其中:第4章 80 x86指令系统 REG字段规定一个寄存器操作数,它作为源操作数还是目的操作数已由第一字节中的D位规定。由REG字段选择寄存器的具体规定如表4.1所示。表4.1 REG字段编码表 REGW=1(字操作)W=0(字节操作)000AXAL001CXCL010DXD

4、L011BXBL100SPAH101BPCH110SIDH111DIBH第4章 80 x86指令系统 MOD字段用来区分另一个操作数在寄存器中(寄存器寻址)还是在存储器中(存储器寻址),在存储器寻址的情况下,还用来指出该字节后面有无位移量,有多少位位移量。MOD字段的编码如表4.2所示。表4.2 MOD字段编码表 MOD寻址方式 00存储器寻址,没有位移量 01存储器寻址,有8位位移 10存储器寻址,有16位位移 11寄存器寻址,没有位移量 第4章 80 x86指令系统 R/M字段受MOD字段控制。MOD=11为寄存器方式,R/M字段将指出第二操作数所在的寄存器编号;MOD=00,01,10为

5、存储器方式,R/M则指出如何计算存储器中操作数的偏移地址。MOD与R/M字段组合的寻址方式见表4.3。第4章 80 x86指令系统 表表4.3 MOD与与R/M字段组合的寻址方式字段组合的寻址方式 第4章 80 x86指令系统 例例4.1 MOV AH,BX+DI+50H 代码格式:100010100110000101010000OPCODE D W MOD REG R/M disp8指令码为:8A6150H 第4章 80 x86指令系统 例例 4.2 ADD dispBXDI,DX ;disp=2345H 代码格式:00000001100100010101000000100011OPCODE

6、 D W MOD REG R/M dispHi disp-Hi指令码为:01914523H 第4章 80 x86指令系统 4.1.2 8086/8088指令系统的寻址方式指令系统的寻址方式 1操作数的种类操作数的种类 1)数据操作数 这类操作数是与数据有关的操作数,即指令中操作的对象是数据。数据操作数又可分为:(1)立即数操作数。指令中要操作的数据包含在指令中。(2)寄存器操作数。指令中要操作的数据存放在指定的寄存器中。(3)存储器操作数。指令中要操作的数据存放在指定的存储单元中。(4)I/O操作数。指令中要操作的数据来自或送到I/O端口。第4章 80 x86指令系统 2)地址操作数 这类操作

7、数是与程序转移地址有关的操作数,即指令中操作的对象不是数据,而是要转移的目标地址。它也可以分为立即数操作数、寄存器操作数和存储器操作数,即要转移的目标地址包含在指令中,或存放在寄存器中,或存放在存储单元之中。对于数据操作数,有的指令有两个操作数:一个称为源操作数,在操作过程中其值不改变;另一个称为目的操作数,操作后一般被操作结果代替。有的指令只有一个操作数,或没有(或隐含)操作数。对于地址操作数,指令只有一个目的操作数,它是一个供程序转移的目标地址。第4章 80 x86指令系统 2寻址方式 所谓寻址方式,就是指指令中给出的寻找操作数(包括数据操作数和地址操作数)的方法。根据操作数的种类,808

8、6/8088指令系统的寻址方式分为两大类:数据寻址方式和地址寻址方式。1)数据寻址方式 数据寻址方式可分为立即数寻址方式、寄存器寻址方式、存储器寻址方式和I/O端口寻址方式四种类型。第4章 80 x86指令系统 (1)立即数寻址方式(Immediate Addressing)。立即数寻址方式所提供的操作数直接包含在指令中,紧跟在操作码之后,它作为指令的一部分,这种操作数称为立即数。立即数可以是位的,也可以是16位的。如果是16位数,则高位字节存放在高地址存储单元中,低位字节存放在低地址存储单元中。例如:MOV BL,80HMOV AX,1090H则指令执行情况如图4.2所示。执行结果为:(BL

9、)=80H,(AX)=1090H。第4章 80 x86指令系统 图4.2 立即数寻址方式指令的执行情况 第4章 80 x86指令系统 (2)寄存器寻址方式(Register Addressing)。寄存器寻址方式的操作数存放在指令规定的寄存器中,寄存器的名字在指令中指出。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP。对于位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH或DL。例如:MOV CL,DLMOV AX,BX如果(DL)=50H,(BX)=1234H,则指令执行情况如图4.3所示。执行结果为:(CL)=50H,(AX)=1234H。第4章

10、80 x86指令系统 图4.3 寄存器寻址方式的指令执行情况 由于寄存器寻址方式的操作数就在CPU内部的寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运行速度。第4章 80 x86指令系统 (3)存储器寻址方式(Memory Addressing)。存储器寻址方式的操作数存放在存储单元中。在第3章中已经知道,操作数在存储器中的物理地址是由段地址左移4位与操作数在段内的偏移地址相加得到的。段地址在实模式和保护模式下可从不同途径取得。本节要讨论的问题是指令中是如何给出存储器操作数在段内的偏移地址的。偏移地址又称为有效地址(Effective Address,EA),所以存储器寻址方式即

11、为求得有效地址(EA)的不同途径。第4章 80 x86指令系统 有效地址可以由以下三种地址分量组成:位移量(Displacement):它是存放在指令中的一个8位或16位的数,但它不是立即数,而是一个地址。基址(Base Address):它是存放在基址寄存器BX或BP中的内容。变址(Index Addess):它是存放在变址寄存器SI或DI中的内容。对于某条具体指令,这三个地址分量可有不同的组合。如果存在两个或两个以上的分量,那么就需要进行加法运算,求出操作数的有效地址(EA),进而求出物理地址(PA)。正是因为这三种地址分量有不同的组合,才使得对存储器操作数的寻址产生了若干种不同的方式。第

12、4章 80 x86指令系统 直接寻址方式(Direct Addressing)。直接寻址方式的操作数有效地址只包含位移量一种分量,即在指令的操作码后面直接给出有效地址。对这种寻址方式有:EA=位移量。例如:MOV AL,1064H 如果(DS)=2000H,则指令执行情况如图4.4所示。执行结果为:(AL)=45H。第4章 80 x86指令系统 图4.4 直接寻址方式的指令执行情况第4章 80 x86指令系统 注意这种直接寻址方式与前面介绍的立即数寻址方式的不同。从指令的表示形式来看,在直接寻址方式中,对于表示有效地址的16位数,必须加上方括号。从指令的功能上来看,本例指令的功能不是将立即数1

13、064H 传送到累加器AL,而是将一个有效地址是1064H的存储单元的内容传送到AL。设此时数据段寄存器(DS)=2000H,则该存储单元的物理地址为:PA=2000H10H+1064H=20000H+1064H=21064H第4章 80 x86指令系统 如果没有特殊指明,直接寻址方式的操作数一般在存储器的数据段中,即隐含的段寄存器是DS。但是8086/8088也允许段超越,此时需要在指令中特别标明,方法是在有关操作数的前面写上操作数所在段的段寄存器名,再加上冒号。例如,若以上指令中源操作数不在数据段而在附加数据段中,则指令应写为如下形式:MOV AL,ES:1064H 在汇编语言指令中,可以

14、用符号地址来表示位移量。例如:MOV AL,value 或MOV AL,value此时value为存储单元的符号地址。第4章 80 x86指令系统 寄存器间接寻址方式(Register Indirect Addressing)。寄存器间接寻址方式的操作数有效地址只包含基址寄存器(BX)的内容或变址寄存器(SI、DI)的内容一种分量。因此,操作数的有效地址在某个寄存器中,而操作数本身则在存储器中的数据段内。这与寄存器寻址方式操作数就在寄存器中是不同的。寄存器间接寻址方式的有效地址表示为:EA=(SI)(DI)(BX)第4章 80 x86指令系统 书写指令时,用做间址的寄存器必须加上方括弧,以免与

15、一般的寄存器寻址方式混淆。例如:MOV AX,SIMOV BX,AL 如果(DS)=3000H,(SI)=2000H,(BX)=1000H,(AL)=64H,则上述两条指令的执行情况如图4.5所示。执行结果为:(AX)=4050H,(31000H)=64H。第4章 80 x86指令系统 图4.5 寄存器间接寻址方式的指令执行情况 同样,寄存器间接寻址方式也允许段超越。例如:MOV ES:DI,AX 第4章 80 x86指令系统 寄存器相对寻址方式(Register Relative Addressing)。寄存器相对寻址方式的操作数有效地址EA是一个基址寄存器或变址寄存器的内容和指令中给定的8

16、位或16位位移量相加之和,所以有效地址由两种分量组成。可用做寄存器相对寻址方式的寄存器有基址寄存器BX、BP和变址寄存器SI、DI。即(SI)(DI)(BX)(BP)EA=+disp8/disp16第4章 80 x86指令系统 上述位移量可以看成是一个存放于寄存器中的基值的一个相对值,故称为寄存器相对寻址方式。在一般情况下,若指令中指定的寄存器是BX、SI、DI,则操作数默认为存放在数据段中;若指令中指定的寄存器是BP,则操作数默认为存放在堆栈段中。同样,寄存器相对寻址方式也允许段超越。位移量既可以是一个8位或16位的立即数,也可以是符号地址。例如:MOV SI+10H,AX MOV CX,B

17、X+COUNT 第4章 80 x86指令系统 如果(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H,(AX)=4050H,则指令执行情况如图4.6所示。执行结果为:(32010H)=4050H,(CX)=4030H。图图4.6 寄存器相对寻址方式的指令执行情况寄存器相对寻址方式的指令执行情况 第4章 80 x86指令系统 该寻址方式的操作数在汇编语言指令中书写时可以是下述形式之一:MOV AL,BP+TABLEMOV AL,BP+TABLEMOV AL,TABLEBP 其实以上三条指令代表的是同一功能的指令。其中TABLE为8位或16位位移量。第4章 8

18、0 x86指令系统 基址变址寻址方式(Based Indexed Addressing)。基址变址寻址方式的操作数有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,所以有效地址由两种分量组成。即 在一般情况下,由基址寄存器决定操作数在哪个段中。若用BX的内容作为基地址,则操作数在数据段中;若用BP的内容作为基地址,则操作数在堆栈段中。基址变址寻址方式同样也允许段超越。例如:MOV BX+DI,AX MOV AH,BPSI 第4章 80 x86指令系统 设当前(DS)=3000H,(SS)=4000H,(BX)=1000H,(DI)=1100H,(AX)=0050H

19、BP)=2000H,(SI)=1200H,则指令的执行情况如图4.7所示。执行结果为:(32100H)=0050H,(AH)=56H。图4.7 基址变址寻址方式的指令执行情况第4章 80 x86指令系统 该寻址方式的操作数在汇编语言指令中书写时可以是下列形式之一:MOV AX,BP+SI MOV AX,BPSI 第4章 80 x86指令系统 基址变址相对寻址方式(Based Indexed Relative Addressing)。基址变址相对寻址方式的操作数有效地址是一个基址寄存器内容、一个变址寄存器内容与指令中指定的一个8位或16位位移量之和,所以有效地址由三个分量组成。即 第4章 8

20、0 x86指令系统 同样,当基址寄存器为BX时,操作数在数据段中;基址寄存器为BP时,操作数在堆栈段中。基址变址相对寻址方式同样也允许段超越。例如:MOV AH,BX+DI+1234HMOV BP+SI+DATA,CX 若(DS)=4000H,(SS)=5000H,(BX)=1000H,(DI)=1500H,(BP)=2000H,(SI)=1050H,(CX)=2050H,DATA=10H,则指令执行情况如图4.8所示。执行结果为:(AH)=64H,(53060H)=2050H。第4章 80 x86指令系统 基址变址相对寻址方式也可以表示成以下几种不同的形式:MOV AX,BX+SI+COUN

21、TMOV AX,BXSI+COUNTMOV AX,BX+SICOUNT MOV AX,BXSICOUNT MOV AX,COUNTBXSI 第4章 80 x86指令系统 图4.8 基址变址相对寻址方式的指令执行情况 第4章 80 x86指令系统 (4)I/O端口寻址方式。I/O端口寻址有以下两种寻址方式:端口直接寻址方式。对这种寻址方式,端口地址用8位立即数(0255)表示。例如:IN AL,21H 此指令表示从地址为21H的端口中读取数据送到AL中。假设21H端口提供的数据为7FH,则指令执行情况如图4.9所示。执行结果为:将21H端口提供的数据7FH输入到8位寄存器AL中。第4章 80 x

22、86指令系统 端口间接寻址方式。当I/O端口地址大于FFH时,必须事先将端口地址存放在DX寄存器中。例如:MOV DX,120H OUT DX,AX 前一条指令将端口地址120H送到DX寄存器,后一条指令将AX中的内容输出到地址由DX寄存器内容所指定的端口中。指令执行情况如图4.10所示。执行结果为:将AX寄存器的内容输出到120H端口。第4章 80 x86指令系统 图4.9 端口直接寻址的指令执行情况 第4章 80 x86指令系统 图4.10 端口间接寻址的指令执行情况 第4章 80 x86指令系统 2)地址寻址方式 在8086/8088指令系统中,有一组指令被用来控制程序的执行顺序。程序的

23、执行顺序是由CS和IP的内容所决定的。通常情况下,当BIU完成一次取指周期后,就自动改变IP的内容以指向下一条指令的地址,使程序按预先存放在程序存储器中的指令的次序,由低地址到高地址顺序执行。如需要改变程序的执行顺序,当转移到所要求的指令地址再顺序执行时,可以安排一条程序转移指令,并按指令的要求修改IP内容或同时修改IP和CS的内容,从而将程序转移到指令所指定的转移地址。地址寻址方式就是找出程序转移的地址。转移地址可以在段内(称为段内转移),也可以跨段(称段间转移)。寻求转移地址的方法称为地址寻址方式,它有如下四种方式。第4章 80 x86指令系统 (1)段内直接寻址方式。段内直接寻址方式也称

24、为相对寻址方式。转移的地址是当前的IP内容和指令规定的下一条指令到目标地址之间的8位或16位相对位移量之和,相对位移量可正可负。当位移量是8位时,称为短转移,转移范围为128+127;位移量是16位时,称为近转移,转移范围为32768+32767。这种寻址方式适用于无条件转移或条件转移类指令。但条件转移里只有8位位移量的短转移。第4章 80 x86指令系统 段内直接寻址转移指令的格式可以表示为:JMP NEAR PTR PROGIAJMP SHORT QUEST 其中,PROGIA和QUEST均为转向的目标地址,在机器指令中,用位移量来表示。在汇编语言中,如果位移量为16位,则在目标地址前加操

25、作符NEAR PTR;如果位移量为位,则在目标地址前加操作符SHORT。但是,如果目标地址的标号已经定义(即标号先定义后引用),那么,即使在标号前没有写运算符SHORT,汇编程序也能自动生成一个2字节的短转移指令。这种情况属于隐含的短转移。第4章 80 x86指令系统 (2)段内间接寻址方式。该寻址方式的程序转移地址存放在寄存器或存储单元中。存储器可用各种数据寻址方式表示。指令的操作是用指定的寄存器或存储器中的值取代当前IP的内容,以实现程序的段内转移。这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。也就是说,条件转移指令只能使用段内直接寻址的位位移量。第4章 80 x86指令系

26、统 段内间接寻址转移指令的格式可以表示为:JMP BXJMP WORD PTR BP+TABLE 其中WORD PTR为操作符,用以指出其后的寻址方式所取得的目标地址是一个字的有效地址。第4章 80 x86指令系统 (3)段间直接寻址方式。这种寻址方式是在指令中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP的内容。指令的格式可以表示为:JMP LABEL_NAME JMP FAR PTR NEXTROUTINT其中,LABEL_NAME是一个在另外的代码段内已定义的远标号。指令的操作是用标号的偏移地址取代指令指针寄存器IP的内容,同时用标号所在段的段地址取代当前代码段寄存器C

27、S的内容,结果使程序转移到另一代码段内指定的标号处。第二条指令利用运算符将标号NEXTROUTINT的属性定义为FAR。第4章 80 x86指令系统 (4)段间间接寻址方式。这种寻址方式是由指令中给出的存储器寻址方式求出存放转移地址的四个连续存储单元的地址。指令的操作是将存储器的前两个单元的内容送给IP,后两个单元的内容送给CS,以实现到另一个段的转移。以下是两条段间间接转移指令的例子:JMP VAR_DOUBLEWORDJMP DWORD PTRBPDI上面第一条指令中,VAR_DOUBLEWORD应是一个已定义为32位的存储器变量;第二条指令中,利用运算符PTR将存储器操作数的类型定义为D

28、WORD(双字)。第4章 80 x86指令系统 4.1.3 8086/8088指令系统 8086/8088的指令系统大致可分成以下六种类型:数据传送指令 算术运算指令 位操作指令 串操作指令 程序控制指令 处理器控制指令第4章 80 x86指令系统 1数据传送指令数据传送指令 数据传送指令是程序中使用最频繁的指令。这是因为不论程序针对何种具体的实际问题,往往都需要将原始数据、中间结果、最终结果以及其他各种信息在CPU的寄存器和存储器或I/O端口之间多次传送。数据传送指令按其功能的不同,可以分为通用数据传送指令、输入输出指令、目标地址传送指令和标志传送指令等四组。第4章 80 x86指令系统 1

29、)通用数据传送指令 通用数据传送指令有以下四种。(1)数据传送指令MOV(MOVement)。指令格式及操作:MOV dst,src ;(dst)(src)指令格式中的dst表示目的操作数,src表示源操作数(下同)。指令实现的操作是将源操作数送给目的操作数。这种传送实际上是进行数据的“复制”,源操作数本身不变。第4章 80 x86指令系统 这种双操作数指令在汇编语言中的表示方法,总是将目的操作数写在前面,源操作数写在后面,二者之间用一个逗号隔开。在MOV指令中源操作数可以是存储器、寄存器、段寄存器和立即数;目的操作数可以是存储器、寄存器(不能为IP)和段寄存器(不能为CS)。数据传送的方向如

30、图4.11所示。图4.11 MOV指令数据传送方向 第4章 80 x86指令系统 必须注意,不能用一条MOV指令实现以下传送:存储单元之间的传送。立即数至段寄存器的传送。段寄存器之间的传送。需说明一点,对于代码段寄存器CS和指令指针寄存器IP,通常无需用户利用传送指令改变其中的内容。但是CS可以作为源操作数。第4章 80 x86指令系统 (2)堆栈操作指令。堆栈操作指令是用来完成压入和弹出堆栈操作的。8086/8088指令系统中提供了完成这两种操作的相应指令。压入堆栈指令PUSH(PUSH word onto stack)。指令格式及操作:PUSHsrc ;(SP)(SP)2,(SP)+1:(

31、SP)(src)第4章 80 x86指令系统 指令完成的操作是“先移后入”,即先将堆栈指针SP减2,使SP始终指向栈顶,然后再将操作数src压入(SP)+1和(SP)两个存储单元中。指令中的操作数src可以是通用寄存器和段寄存器,也可以是由某种寻址方式所指示的存储单元,但不能是立即数。例如:PUSH AX ;(SP)(SP)2,(SP)+1)(AH),(SP)(AL)PUSH CSPUSH SI 第4章 80 x86指令系统 弹出堆栈指令POP(POP word off stack)。指令格式及操作:POP dst ;(dst)(SP)+1:(SP),(SP)(SP)+2 指令完成的操作是“先

32、出后移”,即先将堆栈指针SP所指示的栈顶存储单元的值弹出到操作数dst中,然后再将堆栈指针SP加2,使其指向栈顶。指令中的操作数dst可以是存储器、通用寄存器或段寄存器(但不能是代码段寄存器CS),同样也不能是立即数。例如:POP BX ;(BL)(SP),(BH)(SP)+1),(SP)(SP)+2 POP ES POP MEMDI 应该注意,堆栈操作指令中的操作数类型必须是字操作数,即16位操作数。第4章 80 x86指令系统 (3)数据交换指令XCHG(eXCHanGe)。指令格式及操作:XCHG dst,src ;(dst)(src)该指令的操作是使源操作数与目的操作数进行交换,即不仅

33、将源操作数传送到目的操作数,而且同时将目的操作数传送到源操作数。交换指令的源操作数和目的操作数各自均可以是寄存器或存储器,但不能二者同时为存储器。也就是说,可以在寄存器与寄存器之间,或者寄存器与存储器之间进行交换。此外,段寄存器的内容不能参加交换。交换的内容可以是一个字节(8位),也可以是一个字(16位)。第4章 80 x86指令系统 (4)字节转换指令XLAT(transLATe)。指令格式及操作:XLAT src_table ;(AL)(BX)+(AL)XLAT指令是字节查表转换指令,可以根据表中元素的序号,查出表中相应元素的内容。为了实现查表转换,预先应将表的首地址,即表头地址传送到BX

34、寄存器,元素的序号即位移量送AL,表中第一个元素的序号为0,然后依次是1,2,3,。执行XLAT指令后,表中指定序号的元素存于AL。由于需要将元素的序号送AL寄存器,所以被寻址的表的最大长度为255个字节。这是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。利用XLAT指令实现不同数制或编码系统之间的转换十分方便。第4章 80 x86指令系统 图4.12 十六进制数的ASCII码表第4章 80 x86指令系统 例如内存的数据段有一张十六进制数的ASCII码表,其首地址为Hex_table,如图4.12所示,为了查出第10个元素(元素序号从0开始),即十六进制数A的ASCII码,

35、可用以下几条指令实现:MOV BX,OFFSET Hex_table;(BX)表首址MOV AL,0AH ;(AL)序号XLAT Hex_table ;查表转换结果十六进制数A的ASCII码在AL中,即(AL)=41H。第4章 80 x86指令系统 上例中查表转换指令后面的操作数首地址Hex_table(类型为字节),实际上已经预先传送到BX寄存器中,写在XLAT指令中是为了汇编程序用以检查类型的正确性。但是XLAT指令后面也可以不写操作数。BX寄存器中包含着表的首地址,所在的段由隐含值确定(即DS)。但也允许段超越,此时必须在指令中写明重设的段寄存器。XLAT指令的几种表示形式如下:XLAT

36、不写操作数XLAT src_table ;写操作数XLATB ;B表示字节类型,不允许再写操作数 XLAT ES:src_table ;重设段寄存器为ES,必须写操作数 第4章 80 x86指令系统 2)输入输出指令 输入输出指令共有两条。输入指令IN用于从外设端口读入数据,输出指令OUT则向端口发送数据。无论是读入的数据或是准备发送的数据都必须放在寄存器AL(字节)或AX(字)中。输入输出指令可以分为两大类:一类是端口直接寻址的输入输出指令;另一类是端口通过DX寄存器间接寻址的输入输出指令。在直接寻址的指令中只能寻址256个端口(0255),而间接寻址的指令中可寻址64 K个端口(0655

37、35)。第4章 80 x86指令系统 (1)输入指令IN(INput byte or word)。输入指令分直接寻址输入指令和间接寻址输入指令。直接寻址的输入指令。指令格式及操作:IN acc,port ;(acc)(port)指令中直接给出端口地址(地址小于0FFH),其功能为从指令中直接指定的端口中读入一个字节或一个字送AL或AX。第4章 80 x86指令系统 间接寻址的输入指令。指令格式及操作:IN acc,DX ;(acc)(DX)此指令是从DX寄存器内容指定的端口中将8/16位数据送入AL/AX中。这种寻址方式的端口地址由16位地址表示,执行此指令前应将16位地址存入DX寄存器中。第

38、4章 80 x86指令系统 (2)输出指令OUT(OUTput byte or word)。输出指令分直接寻址输出指令和间接寻址输出指令。直接寻址的输出指令。指令格式及操作:OUT port,acc ;(port)(acc)此指令将AL(8位)或AX(16位)中的数据输出到指令指定的I/O端口,端口地址应不大于FFH。第4章 80 x86指令系统 间接寻址的输出指令。指令格式及操作:OUT DX,acc ;(DX)(acc)此指令将AL(8位)或AX(16位)中的数据输出到由DX寄存器内容指定的I/O端口中。第4章 80 x86指令系统 3)目标地址传送指令 8086/8088 CPU提供了三

39、条把地址指针写入寄存器或寄存器对的指令,它们可以用来写入近地址指针和远地址指针。(1)取有效地址指令LEA(Load Effective Address)。指令格式:LEA reg16,mem LEA指令将一个近地址指针写入到指定的寄存器。指令中的目的操作数必须是一个16位通用寄存器,源操作数必须是一个存储器操作数,指令的执行结果是把源操作数的有效地址,即16位偏移地址传送到目标寄存器。例如:第4章 80 x86指令系统 LEA BX,BUFFER;(BX)OFFSET BUFFERLEA AX,BPDI;(AX)(BP)+(DI)LEA DX,BETABXSI;(DI)(BP)+(SI)+B

40、ETA注意LEA指令与MOV指令的区别,比较下面两条指令:LEA BX,BUFFER MOV BX,BUFFER 第4章 80 x86指令系统 前者将存储器变量BUFFER的偏移地址送到BX,而后者将存储器变量BUFFER的内容(两个字节)传送到BX。当然也可以用MOV指令来得到存储器的偏移地址,例如以下两条指令的效果相同:LEA BX,BUFFERMOV BX,OFFSET BUFFER其中OFFSET BUFFER表示存储器变量BUFFER的偏移地址。第4章 80 x86指令系统 (2)地址指针装入DS指令LDS(Load pointer into DS)。指令格式:LDS reg16,m

41、em32 LDS指令和下面即将介绍的LES指令都是用于写入远地址指针。源操作数是存储器操作数,目的操作数可以是任一个16位通用寄存器。LDS传送一个32位的远地址指针,其中包括一个偏移地址和一个段地址,前者送指令中指定的寄存器(目的操作数),后者送数据段寄存器DS。例如:LDS SI,0010H设当前(DS)=C000H,而有关存储单元的内容为(C0010H)=80H,(C0011H)=01H,(C0012H)=00H,(C0013H)=20H,则执行该指令后,SI寄存器的内容为0180H,段寄存器DS的内容为2000H。第4章 80 x86指令系统 (3)地址指针装入ES指令LES(Load

42、 pointer into ES)。指令格式:LES reg16,mem32 LES指令与LDS类似,也是装入一个32位的远地址指针。位移地址送指定寄存器,但是,段地址送附加段寄存器ES。目标地址传送指令常常用于在串操作时建立初始的地址指针。第4章 80 x86指令系统 4)标志传送指令 8086/8088 CPU中有一标志寄存器FLAGS,其中包括6个状态标志位和3个控制位。每一状态标志位表示CPU运行的状态。许多指令执行结果会影响标志寄存器的某些状态标志位。同时,有些指令的执行也受标志寄存器中控制位的控制。标志传送指令共有4条。这些指令都是单字节指令,指令的操作数为隐含形式。第4章 80

43、x86指令系统 (1)取标志指令LAHF(Load AH from Flags)。指令格式:LAHF LAHF指令将标志寄存器FLAGS中的5个状态标志位SF、ZF、AF、PF以及CF分别取出传送到累加器AH的对应位,如图4.13所示。LAHF指令对状态标志位没有影响。图4.13 LAHF指令操作示意图 第4章 80 x86指令系统 (2)置标志指令SAHF(Store AH into Flags)。指令格式:SAHF SAHF指令的传送方向与LAHF相反,将AH寄存器中的第7、6、4、2、0位分别传送到标志寄存器的对应位,如图4.14所示。图4.14 SAHF指令操作示意图 第4章 80 x

44、86指令系统 (3)标志压入堆栈指令PUSHF(PUSH Flags onto stack)。指令格式及操作:PUSHF ;(SP)(SP)2,(SP)+1):(SP)(FLAGS)PUSHF指令先将SP减2,然后将标志寄存器FLAGS的内容(16位)压入堆栈。这条指令本身不影响状态标志位。第4章 80 x86指令系统 (4)标志弹出堆栈指令POPF(POP Flags off stack)。指令格式及操作:POPF ;(FLAGS)(SP)+1:(SP),(SP)(SP)+2 POPF指令的操作与PUSHF相反,它将堆栈内容弹出到标志寄存器,然后SP加2。POPF指令对状态标志位有影响,使各

45、状态标志位恢复为压入堆栈以前的状态。PUSHF指令可用于调用过程时保护当前标志寄存器的值,过程返回以后再使用POPF指令恢复标志寄存器原来的值。数据传送指令除了SAHF和POPF外都不影响状态标志位。第4章 80 x86指令系统 2算术运算指令 1)算术运算的数据类型 8086/8088的算术运算指令可以处理四种类型的数:无符号的二进制数、带符号的二进制数、无符号的压缩十进制数(压缩型BCD码)和无符号的非压缩十进制数(非压缩型BCD码)。除压缩十进制数只有加/减运算外,其余三种数据类型都可以进行加、减、乘、除运算。二进制的无符号数和带符号数的长度都可以是8位或16位,但应注意它们所能表示的数

46、的范围是不同的。若是带符号数,则用补码表示。第4章 80 x86指令系统 十进制数以字节的形式存储。对压缩十进制数,每个字节存两位数,即两位BCD码,因而对于一个字节来说,压缩十进制数的范围是099。而对非压缩的十进制数,每个字节存一位数,即由字节的低4位决定存放的数字,对于高4位,在进行乘/除运算时必须全为0,加/减运算时可以是任何值。8086/8088提供的各种调整操作指令可以方便地进行压缩或非压缩十进制数的算术运算。第4章 80 x86指令系统 2)算术运算指令对标志位的影响 8086/8088的算术运算指令将运算结果的某些特性传送到6个状态标志位上去,这些标志位中的绝大多数可由跟在算术

47、运算指令后的条件转移指令进行测试,以改变程序的流程。因此掌握指令执行结果对标志位的影响,对编程有着重要的作用。关于6个状态标志位的含义已在第3章中做了介绍,这里不再重复。算术运算类指令共有20条,包括加、减、乘、除运算,符号扩展和十进制调整指令,除符号扩展指令(CBW,CWD)外,其余指令都影响标志位。第4章 80 x86指令系统 3)二进制数运算指令 二进制数运算指令包括加法、减法、乘法、除法和符号扩展指令等五种。(1)加法指令。加法指令包括不带进位加法指令、带进位加法指令和加1指令。加法指令ADD(ADDition)。指令格式及操作:ADD dst,src ;(dst)(dst)+(src

48、)ADD指令将目的操作数与源操作数相加,并将结果送给目的操作数。加法指令将影响状态标志位。第4章 80 x86指令系统 目的操作数可以是寄存器或存储器,源操作数可以是寄存器、存储器或立即数。但是源操作数和目的操作数不能同时为存储器。另外,不能对段寄存器进行加法运算(段寄存器也不能参加、减、乘、除运算)。加法指令的操作对象可以是8位数(字节),也可以是16位数(字)。例如:ADD CL,10ADD DX,SIADD AX,MEMADD DATABX,AL ADD ALPHADI,30H;变量ALPHA的类型决定指令完成字节加还是字加 第4章 80 x86指令系统 相加的数据类型可以根据编程者的意

49、图,规定为带符号数或无符号数。对于无符号数,若相加结果超出了8位或16位无符号数所能表示的范围,则进位标志位CF被置1;对于带符号数,如 果 相 加 结 果 超 出 了 8位 或 16位 补 码 所 能 表 示 的 范 围(128+127或32 768+32 767),则溢出标志位OF被置1,结果溢出。第4章 80 x86指令系统 带进位加法指令ADC(ADdition with Carry)。指令格式及操作:ADC dst,src ;(dst)(dst)+(src)+(CF)ADC指令是将目的操作数与源操作数相加,再加上进位标志CF的内容,然后将结果送给目的操作数。与ADD指令一样,ADC指

50、令的运算结果也将修改状态标志位。目的操作数及源操作数的类型与ADD指令相同,而且ADC指令同样也可以进行字节操作或字操作。带进位加法指令主要用于多字节数据的加法运算。如果低字节相加时产生进位,则在下一次高字节相加时将这个进位加进去。第4章 80 x86指令系统 例 4.3 计 算 两 个 多 字 节 十 六 进 制 数 之 和:3B74AC60F8H+20D59E36C1H=?式中被加数和加数均有5个字节,可以编一个循环程序实现以上运算。假设已将被加数和加数分别存入从DATA1和DATA2开始的两个内存区,且均为低位字节在前,高位字节在后,如图4.15所示。要求相加所得结果仍存回以DATA1为

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

宁ICP备18001539号-1