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

上传人:1888****888 文档编号:48644073 上传时间:2022-01-12 格式:PPT 页数:305 大小:3.21MB
返回 下载 相关 举报
《微型计算机原理》(王忠民版)PPT电子课件教案第4章80x86指令系统_第1页
第1页 / 共305页
《微型计算机原理》(王忠民版)PPT电子课件教案第4章80x86指令系统_第2页
第2页 / 共305页
《微型计算机原理》(王忠民版)PPT电子课件教案第4章80x86指令系统_第3页
第3页 / 共305页
点击查看更多>>
资源描述
第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指令系统 8086/8088指令系统的指令类型较多,功能很强。各种指令由于功能不同,需要指令码提供的信息也不同。为了满足不同功能的要求又要尽量减少指令所占的空间,8086/8088指令系统采用了一种灵活的、由16个字节组成的变字长的指令格式,包括操作码、寻址方式以及操作数三个部分,如图4.1所示。 通常指令的第一字节为操作码字节(OPCODE),规定指令的操作类型;第二字节为寻址方式字节(MOD),规定操作数的寻址方式;接着以后的36字节依据指令的不同而取舍,可变字长的指令主要体现在这里,一般由它指出存储器操作数地址的位移量或立即数。 第4章 80 x86指令系统 OPCODEdata/disp-8OPCODEMODOPCODEMODdata/disp-LoOPCODEMODdata/disp-Hidisp-LoOPCODEMODdisp-Hidata-8disp-LoOPCODEMODdisp-Hidisp-Lodisp-Hi图4.1 8086/8088不同字长的指令码格式 第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(字节操作) 000AXAL001CXCL010DXDL011BXBL100SPAH101BPCH110SIDH111DIBH第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为存储器方式,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 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) 地址操作数 这类操作数是与程序转移地址有关的操作数,即指令中操作的对象不是数据,而是要转移的目标地址。它也可以分为立即数操作数、寄存器操作数和存储器操作数,即要转移的目标地址包含在指令中,或存放在寄存器中,或存放在存储单元之中。 对于数据操作数,有的指令有两个操作数:一个称为源操作数,在操作过程中其值不改变;另一个称为目的操作数,操作后一般被操作结果代替。有的指令只有一个操作数,或没有(或隐含)操作数。 对于地址操作数,指令只有一个目的操作数,它是一个供程序转移的目标地址。 第4章 80 x86指令系统 2寻址方式 所谓寻址方式,就是指指令中给出的寻找操作数(包括数据操作数和地址操作数)的方法。根据操作数的种类,8086/8088指令系统的寻址方式分为两大类:数据寻址方式和地址寻址方式。 1) 数据寻址方式 数据寻址方式可分为立即数寻址方式、寄存器寻址方式、存储器寻址方式和I/O端口寻址方式四种类型。 第4章 80 x86指令系统 (1) 立即数寻址方式(Immediate Addressing)。立即数寻址方式所提供的操作数直接包含在指令中,紧跟在操作码之后,它作为指令的一部分,这种操作数称为立即数。立即数可以是位的,也可以是16位的。如果是16位数,则高位字节存放在高地址存储单元中,低位字节存放在低地址存储单元中。例如:MOV BL,80HMOV AX,1090H则指令执行情况如图4.2所示。执行结果为:(BL)=80H,(AX)=1090H。 第4章 80 x86指令系统 BL操作码80H存储器AX操作码90H10H存储器图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章 80 x86指令系统 50HCLDLAX12H34HBX图4.3 寄存器寻址方式的指令执行情况 由于寄存器寻址方式的操作数就在CPU内部的寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运行速度。 第4章 80 x86指令系统 (3) 存储器寻址方式(Memory Addressing)。存储器寻址方式的操作数存放在存储单元中。在第3章中已经知道,操作数在存储器中的物理地址是由段地址左移4位与操作数在段内的偏移地址相加得到的。段地址在实模式和保护模式下可从不同途径取得。本节要讨论的问题是指令中是如何给出存储器操作数在段内的偏移地址的。偏移地址又称为有效地址(Effective Address,EA),所以存储器寻址方式即为求得有效地址(EA)的不同途径。 第4章 80 x86指令系统 有效地址可以由以下三种地址分量组成: 位移量(Displacement):它是存放在指令中的一个8位或16位的数,但它不是立即数,而是一个地址。 基址(Base Address):它是存放在基址寄存器BX或BP中的内容。 变址(Index Addess):它是存放在变址寄存器SI或DI中的内容。 对于某条具体指令,这三个地址分量可有不同的组合。如果存在两个或两个以上的分量,那么就需要进行加法运算,求出操作数的有效地址(EA),进而求出物理地址(PA)。正是因为这三种地址分量有不同的组合,才使得对存储器操作数的寻址产生了若干种不同的方式。 第4章 80 x86指令系统 直接寻址方式(Direct Addressing)。直接寻址方式的操作数有效地址只包含位移量一种分量,即在指令的操作码后面直接给出有效地址。对这种寻址方式有:EA=位移量。例如:MOV AL,1064H 如果(DS)=2000H,则指令执行情况如图4.4所示。执行结果为:(AL)=45H。 第4章 80 x86指令系统 图4.4 直接寻址方式的指令执行情况AL操作码64H10H存储器45H20000H21064H20000H1064H21064H代码段数据段第4章 80 x86指令系统 注意这种直接寻址方式与前面介绍的立即数寻址方式的不同。从指令的表示形式来看,在直接寻址方式中,对于表示有效地址的16位数,必须加上方括号。从指令的功能上来看,本例指令的功能不是将立即数1064H 传送到累加器AL,而是将一个有效地址是1064H的存储单元的内容传送到AL。设此时数据段寄存器(DS)=2000H,则该存储单元的物理地址为:PA=2000H10H+1064H=20000H+1064H=21064H第4章 80 x86指令系统 如果没有特殊指明,直接寻址方式的操作数一般在存储器的数据段中,即隐含的段寄存器是DS。但是8086/8088也允许段超越,此时需要在指令中特别标明,方法是在有关操作数的前面写上操作数所在段的段寄存器名,再加上冒号。例如,若以上指令中源操作数不在数据段而在附加数据段中,则指令应写为如下形式: MOV AL,ES:1064H 在汇编语言指令中,可以用符号地址来表示位移量。例如: MOV AL,value 或MOV AL,value此时value为存储单元的符号地址。 第4章 80 x86指令系统 寄存器间接寻址方式(Register Indirect Addressing)。寄存器间接寻址方式的操作数有效地址只包含基址寄存器(BX)的内容或变址寄存器(SI、DI)的内容一种分量。因此,操作数的有效地址在某个寄存器中,而操作数本身则在存储器中的数据段内。这与寄存器寻址方式操作数就在寄存器中是不同的。 寄存器间接寻址方式的有效地址表示为: EA=(SI) (DI) (BX)第4章 80 x86指令系统 书写指令时,用做间址的寄存器必须加上方括弧,以免与一般的寄存器寻址方式混淆。例如: MOV AX,SIMOV BX,AL 如果(DS)=3000H,(SI)=2000H,(BX)=1000H,(AL)=64H,则上述两条指令的执行情况如图4.5所示。执行结果为:(AX)=4050H,(31000H)=64H。 第4章 80 x86指令系统 存储器50H40H30000H32000HAX(DS)10H30000H(SI) 2000H32000H存储器30000H31000HAL64H(DS)10H30000H(BX) 1000H31000H图4.5 寄存器间接寻址方式的指令执行情况 同样,寄存器间接寻址方式也允许段超越。 例如: MOV ES:DI,AX 第4章 80 x86指令系统 寄存器相对寻址方式(Register Relative Addressing)。寄存器相对寻址方式的操作数有效地址EA是一个基址寄存器或变址寄存器的内容和指令中给定的8位或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,BX+COUNT 第4章 80 x86指令系统 如果(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H,(AX)=4050H,则指令执行情况如图4.6所示。执行结果为:(32010H)=4050H,(CX)=4030H。 CX操作码50H10H存储器30H30000H32050H操作码40H(DS)10H30000H(BX) 1000HCOUNT 1050H32050H50HAX操作码10H存储器30000H32010H操作码(DS)10H30000H(SI) 2000H10H32010H40H图图4.6 寄存器相对寻址方式的指令执行情况寄存器相对寻址方式的指令执行情况 第4章 80 x86指令系统 该寻址方式的操作数在汇编语言指令中书写时可以是下述形式之一:MOV AL,BP+TABLEMOV AL,BP+ TABLEMOV AL,TABLEBP 其实以上三条指令代表的是同一功能的指令。其中TABLE为8位或16位位移量。 第4章 80 x86指令系统 基址变址寻址方式(Based Indexed Addressing)。基址变址寻址方式的操作数有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,所以有效地址由两种分量组成。即 )()()()(BPBXDISIEA 在一般情况下,由基址寄存器决定操作数在哪个段中。若用BX的内容作为基地址,则操作数在数据段中;若用BP的内容作为基地址,则操作数在堆栈段中。基址变址寻址方式同样也允许段超越。例如:MOV BX+DI,AX MOV AH,BPSI 第4章 80 x86指令系统 设当前(DS)=3000H,(SS)=4000H,(BX)=1000H,(DI)=1100H,(AX)=0050H,(BP)=2000H,(SI)=1200H,则指令的执行情况如图4.7所示。执行结果为:(32100H)=0050H,(AH)=56H。 存储器30000H32100H00HAX50H(DS)10H30000H(BX) 1000H(DI) 1100H32100H存储器56H40000H43200HAH(SS)10H40000H(BP) 2000H(SI) 1200H43200H图4.7 基址变址寻址方式的指令执行情况第4章 80 x86指令系统 该寻址方式的操作数在汇编语言指令中书写时可以是下列形式之一:MOV AX,BP+SI MOV AX,BPSI 第4章 80 x86指令系统 基址变址相对寻址方式(Based Indexed Relative Addressing)。基址变址相对寻址方式的操作数有效地址是一个基址寄存器内容、一个变址寄存器内容与指令中指定的一个8位或16位位移量之和,所以有效地址由三个分量组成。即 16/8)()()()(dispdispBPBXDISIEA第4章 80 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+COUNTMOV AX,BXSI +COUNTMOV AX,BX+SICOUNT MOV AX,BXSICOUNT MOV AX,COUNTBXSI 第4章 80 x86指令系统 存储器64H40000H43734HAH(DS)10H40000H(BX) 1000H(DI) 1500H1234H43734H存储器50000H53060H20HCX50H(SS)10H50000H(BP) 2000H(SI) 1050HDATA 10H53060H图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 x86指令系统 端口间接寻址方式。当I/O端口地址大于FFH时,必须事先将端口地址存放在DX寄存器中。例如: MOV DX,120H OUT DX,AX 前一条指令将端口地址120H送到DX寄存器,后一条指令将AX中的内容输出到地址由DX寄存器内容所指定的端口中。指令执行情况如图4.10所示。执行结果为:将AX寄存器的内容输出到120H端口。 第4章 80 x86指令系统 7FH接口端口0端口1端口33端口25500H01H21HFFHAL图4.9 端口直接寻址的指令执行情况 第4章 80 x86指令系统 接口端口0端口1端口288端口655350000H0001H0120HFFFFH10F0HAX0120HDX图4.10 端口间接寻址的指令执行情况 第4章 80 x86指令系统 2) 地址寻址方式 在8086/8088指令系统中,有一组指令被用来控制程序的执行顺序。程序的执行顺序是由CS和IP的内容所决定的。通常情况下,当BIU完成一次取指周期后,就自动改变IP的内容以指向下一条指令的地址,使程序按预先存放在程序存储器中的指令的次序,由低地址到高地址顺序执行。如需要改变程序的执行顺序,当转移到所要求的指令地址再顺序执行时,可以安排一条程序转移指令,并按指令的要求修改IP内容或同时修改IP和CS的内容,从而将程序转移到指令所指定的转移地址。地址寻址方式就是找出程序转移的地址。转移地址可以在段内(称为段内转移),也可以跨段(称段间转移)。寻求转移地址的方法称为地址寻址方式,它有如下四种方式。 第4章 80 x86指令系统 (1) 段内直接寻址方式。段内直接寻址方式也称为相对寻址方式。转移的地址是当前的IP内容和指令规定的下一条指令到目标地址之间的8位或16位相对位移量之和,相对位移量可正可负。当位移量是8位时,称为短转移,转移范围为128+127;位移量是16位时,称为近转移,转移范围为32768+32767。这种寻址方式适用于无条件转移或条件转移类指令。但条件转移里只有8位位移量的短转移。 第4章 80 x86指令系统 段内直接寻址转移指令的格式可以表示为:JMP NEAR PTR PROGIAJMP SHORT QUEST 其中,PROGIA和QUEST均为转向的目标地址,在机器指令中,用位移量来表示。在汇编语言中,如果位移量为16位,则在目标地址前加操作符NEAR PTR;如果位移量为位,则在目标地址前加操作符SHORT。但是,如果目标地址的标号已经定义(即标号先定义后引用),那么,即使在标号前没有写运算符SHORT,汇编程序也能自动生成一个2字节的短转移指令。这种情况属于隐含的短转移。 第4章 80 x86指令系统 (2) 段内间接寻址方式。该寻址方式的程序转移地址存放在寄存器或存储单元中。存储器可用各种数据寻址方式表示。指令的操作是用指定的寄存器或存储器中的值取代当前IP的内容,以实现程序的段内转移。 这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。也就是说,条件转移指令只能使用段内直接寻址的位位移量。 第4章 80 x86指令系统 段内间接寻址转移指令的格式可以表示为: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的内容,同时用标号所在段的段地址取代当前代码段寄存器CS的内容,结果使程序转移到另一代码段内指定的标号处。第二条指令利用运算符将标号NEXTROUTINT的属性定义为FAR。 第4章 80 x86指令系统 (4) 段间间接寻址方式。这种寻址方式是由指令中给出的存储器寻址方式求出存放转移地址的四个连续存储单元的地址。指令的操作是将存储器的前两个单元的内容送给IP,后两个单元的内容送给CS,以实现到另一个段的转移。 以下是两条段间间接转移指令的例子:JMP VAR_DOUBLEWORDJMP DWORD PTRBPDI上面第一条指令中,VAR_DOUBLEWORD应是一个已定义为32位的存储器变量;第二条指令中,利用运算符PTR将存储器操作数的类型定义为DWORD(双字)。 第4章 80 x86指令系统 4.1.3 8086/8088指令系统 8086/8088的指令系统大致可分成以下六种类型: 数据传送指令 算术运算指令 位操作指令 串操作指令 程序控制指令 处理器控制指令第4章 80 x86指令系统 1数据传送指令数据传送指令 数据传送指令是程序中使用最频繁的指令。这是因为不论程序针对何种具体的实际问题,往往都需要将原始数据、中间结果、最终结果以及其他各种信息在CPU的寄存器和存储器或I/O端口之间多次传送。 数据传送指令按其功能的不同,可以分为通用数据传送指令、输入输出指令、目标地址传送指令和标志传送指令等四组。 第4章 80 x86指令系统 1) 通用数据传送指令 通用数据传送指令有以下四种。 (1) 数据传送指令MOV (MOVement)。指令格式及操作: MOV dst,src ;(dst)(src) 指令格式中的dst表示目的操作数,src表示源操作数(下同)。指令实现的操作是将源操作数送给目的操作数。这种传送实际上是进行数据的“复制”,源操作数本身不变。 第4章 80 x86指令系统 这种双操作数指令在汇编语言中的表示方法,总是将目的操作数写在前面,源操作数写在后面,二者之间用一个逗号隔开。 在MOV指令中源操作数可以是存储器、寄存器、段寄存器和立即数;目的操作数可以是存储器、寄存器(不能为IP)和段寄存器(不能为CS)。数据传送的方向如图4.11所示。 段寄存器CS DS SS ES存储器通用存储器AX BX CX DXBP SP SI DIALBLCL DLAHBHCH DH16位立即数16位8/16位8/16位8/16位图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:(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 指令完成的操作是“先出后移”,即先将堆栈指针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) 该指令的操作是使源操作数与目的操作数进行交换,即不仅将源操作数传送到目的操作数,而且同时将目的操作数传送到源操作数。 交换指令的源操作数和目的操作数各自均可以是寄存器或存储器,但不能二者同时为存储器。也就是说,可以在寄存器与寄存器之间,或者寄存器与存储器之间进行交换。此外,段寄存器的内容不能参加交换。 交换的内容可以是一个字节(8位),也可以是一个字(16位)。 第4章 80 x86指令系统 (4) 字节转换指令XLAT (transLATe)。指令格式及操作:XLAT src_table ;(AL)(BX)+(AL) XLAT指令是字节查表转换指令,可以根据表中元素的序号,查出表中相应元素的内容。为了实现查表转换,预先应将表的首地址,即表头地址传送到BX寄存器,元素的序号即位移量送AL,表中第一个元素的序号为0,然后依次是1,2,3,。执行XLAT指令后,表中指定序号的元素存于AL。由于需要将元素的序号送AL寄存器,所以被寻址的表的最大长度为255个字节。这是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。利用XLAT指令实现不同数制或编码系统之间的转换十分方便。 第4章 80 x86指令系统 图4.12 十六进制数的ASCII码表30H(0)31H(1)32H(2)39H(9)41H(A)42H(B)46H(F)存储器Hex_table0Hex_table1Hex_table2Hex_table9Hex_table10Hex_table11Hex_table15第4章 80 x86指令系统 例如内存的数据段有一张十六进制数的ASCII码表,其首地址为Hex_table,如图4.12所示,为了查出第10个元素(元素序号从0开始),即十六进制数A的ASCII码,可用以下几条指令实现: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;不写操作数XLAT src_table ;写操作数XLATB ;B表示字节类型,不允许再写操作数 XLAT ES:src_table ;重设段寄存器为ES,必须写操作数 第4章 80 x86指令系统 2) 输入输出指令 输入输出指令共有两条。输入指令IN用于从外设端口读入数据,输出指令OUT则向端口发送数据。无论是读入的数据或是准备发送的数据都必须放在寄存器AL(字节)或AX(字)中。 输入输出指令可以分为两大类:一类是端口直接寻址的输入输出指令;另一类是端口通过DX寄存器间接寻址的输入输出指令。在直接寻址的指令中只能寻址256个端口(0255),而间接寻址的指令中可寻址64 K个端口(065535)。 第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寄存器中。 第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提供了三条把地址指针写入寄存器或寄存器对的指令,它们可以用来写入近地址指针和远地址指针。 (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)+BETA注意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,mem32 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 pointer into ES)。指令格式: LES reg16,mem32 LES指令与LDS类似,也是装入一个32位的远地址指针。位移地址送指定寄存器,但是,段地址送附加段寄存器ES。 目标地址传送指令常常用于在串操作时建立初始的地址指针。 第4章 80 x86指令系统 4) 标志传送指令 8086/8088 CPU中有一标志寄存器FLAGS,其中包括6个状态标志位和3个控制位。每一状态标志位表示CPU运行的状态。许多指令执行结果会影响标志寄存器的某些状态标志位。同时,有些指令的执行也受标志寄存器中控制位的控制。标志传送指令共有4条。这些指令都是单字节指令,指令的操作数为隐含形式。 第4章 80 x86指令系统 (1) 取标志指令LAHF (Load AH from Flags)。指令格式: LAHF LAHF指令将标志寄存器FLAGS中的5个状态标志位SF、ZF、AF、PF以及CF分别取出传送到累加器AH的对应位,如图4.13所示。LAHF指令对状态标志位没有影响。 OF DF IF TF SF ZF AF PF CFAHFLAGS图4.13 LAHF指令操作示意图 第4章 80 x86指令系统 (2) 置标志指令SAHF (Store AH into Flags)。指令格式: SAHF SAHF指令的传送方向与LAHF相反,将AH寄存器中的第7、6、4、2、0位分别传送到标志寄存器的对应位,如图4.14所示。 OF DF IF TF SF ZF AF PF CFAHFLAGS图4.14 SAHF指令操作示意图 第4章 80 x86指令系统 (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指令对状态标志位有影响,使各状态标志位恢复为压入堆栈以前的状态。 PUSHF指令可用于调用过程时保护当前标志寄存器的值,过程返回以后再使用POPF指令恢复标志寄存器原来的值。 数据传送指令除了SAHF和POPF外都不影响状态标志位。 第4章 80 x86指令系统 2算术运算指令 1) 算术运算的数据类型 8086/8088的算术运算指令可以处理四种类型的数:无符号的二进制数、带符号的二进制数、无符号的压缩十进制数(压缩型BCD码)和无符号的非压缩十进制数(非压缩型BCD码)。除压缩十进制数只有加/减运算外,其余三种数据类型都可以进行加、减、乘、除运算。 二进制的无符号数和带符号数的长度都可以是8位或16位,但应注意它们所能表示的数的范围是不同的。若是带符号数,则用补码表示。 第4章 80 x86指令系统 十进制数以字节的形式存储。对压缩十进制数,每个字节存两位数,即两位BCD码,因而对于一个字节来说,压缩十进制数的范围是099。而对非压缩的十进制数,每个字节存一位数,即由字节的低4位决定存放的数字,对于高4位,在进行乘/除运算时必须全为0,加/减运算时可以是任何值。 8086/8088提供的各种调整操作指令可以方便地进行压缩或非压缩十进制数的算术运算。 第4章 80 x86指令系统 2) 算术运算指令对标志位的影响 8086/8088的算术运算指令将运算结果的某些特性传送到6个状态标志位上去,这些标志位中的绝大多数可由跟在算术运算指令后的条件转移指令进行测试,以改变程序的流程。因此掌握指令执行结果对标志位的影响,对编程有着重要的作用。关于6个状态标志位的含义已在第3章中做了介绍,这里不再重复。 算术运算类指令共有20条,包括加、减、乘、除运算,符号扩展和十进制调整指令,除符号扩展指令(CBW,CWD)外,其余指令都影响标志位。 第4章 80 x86指令系统 3) 二进制数运算指令 二进制数运算指令包括加法、减法、乘法、除法和符号扩展指令等五种。 (1) 加法指令。加法指令包括不带进位加法指令、带进位加法指令和加1指令。 加法指令ADD (ADDition)。指令格式及操作: ADD dst,src ;(dst)(dst)+(src) ADD指令将目的操作数与源操作数相加,并将结果送给目的操作数。加法指令将影响状态标志位。 第4章 80 x86指令系统 目的操作数可以是寄存器或存储器,源操作数可以是寄存器、存储器或立即数。但是源操作数和目的操作数不能同时为存储器。另外,不能对段寄存器进行加法运算(段寄存器也不能参加、减、乘、除运算)。加法指令的操作对象可以是8位数(字节),也可以是16位数(字)。例如:ADD CL,10ADD DX,SIADD AX,MEMADD DATABX,AL ADD ALPHADI,30H;变量ALPHA的类型决定指令完成字节加还是字加 第4章 80 x86指令系统 相加的数据类型可以根据编程者的意图,规定为带符号数或无符号数。对于无符号数,若相加结果超出了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指令的运算结果也将修改状态标志位。目的操作数及源操作数的类型与ADD指令相同,而且ADC指令同样也可以进行字节操作或字操作。 带进位加法指令主要用于多字节数据的加法运算。如果低字节相加时产生进位,则在下一次高字节相加时将这个进位加进去。 第4章 80 x86指令系统 例 4 . 3 计 算 两 个 多 字 节 十 六 进 制 数 之 和 :3B74AC60F8H+20D59E36C1H=? 式中被加数和加数均有5个字节,可以编一个循环程序实现以上运算。假设已将被加数和加数分别存入从DATA1和DATA2开始的两个内存区,且均为低位字节在前,高位字节在后,如图4.15所示。要求相加所得结果仍存回以DATA1为首址的内存区。 第4章 80 x86指令系统 程序流程图如图4.16所示。程序如下:MOV CX,5;设置循环次数MOV SI,0 ;置位移量初值CLC ;清进位CFLOOPER:MOV AL,DATA2SI;取一个加数ADC DATA1SI,AL;和一个被加数相加INC SI ;位移量加1DEC CX ;循环次数减1 JNZ LOOPER ;加完否,若没完,转LOOPER,继续相加HLT ;程序暂停 第4章 80 x86指令系统 F8H60HACH存储器DATA174H3BHC1H36H9EHD5H20HDATA2被加数加数图4.15 例4.3中被加数和加数在内存中的存放情况 第4章 80 x86指令系统 开始初始化: 置循环次数清SI, 清进位标志CF取一个字节加数与一个被加数相加并送回内存区SI加1循环次数减1循环次数到结束YN 图4.16 例4.3的程序流程图 第4章 80 x86指令系统 加1指令INC (INCrement by 1)。指令格式及操作: INC dst ;(dst)(dst)+1 INC指令将目的操作数加1,并将结果送回目的操作数。指令将影响状态标志位,如SF、ZF、AF、PF和OF,但对进位标志CF没有影响。 INC指令中目的操作数可以是寄存器或存储器,但不能是立即数和段寄存器。其类型为字节操作或字操作均可。例如: 第4章 80 x86指令系统 INC DLINC SIINC BYTE PTRBXSI INC WORD PTRDI 指令中的BYTE PTR或WORD PTR分别指定随后的存储器操作数的类型是字节或字。 INC指令常常用于在循环程序中修改地址。 第4章 80 x86指令系统 (2) 减法指令。减法指令包括不带借位减法指令、带借位减法指令、减1指令、求补指令和比较指令。 减法指令SUB (SUBtraction)。指令格式及操作: SUB dst,src ;(dst)(dst) (src) SUB指令将目的操作数减源操作数,结果送回目的操作数。指令对状态标志位有影响。 第4章 80 x86指令系统 操作数的类型与加法指令一样,即目的操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器,但不允许两个存储器操作数相减;既可以字节相减,也可以字相减。例如: SUB AL,37H SUB DX,BX SUB CX,VARE1 SUB ARRAYDI,AX SUB BETABXDI,512;BETA为字型变量,若为字节型变量,则源操作数超出范围 第4章 80 x86指令系统 减法数据的类型也可以根据程序员的要求约定为带符号数或无符号数。当无符号数的较小数减较大数时,因不够减而产生借位,此时进位标志CF置1。当带符号数的较小数减较大数时,将得到负的结果,则符号标志SF置1。带符号数相减如果结果溢出,则OF置1。 第4章 80 x86指令系统 带借位减法指令SBB (SuBtraction with Borrow)。指令格式及操作:SBB dst,src ;(dst)(dst)(src)(CF) SBB指令是将目的操作数减源操作数,然后再减进位标志CF,并将结果送回目的操作数。SBB指令对标志位的影响与SUB指令相同。 第4章 80 x86指令系统 目的操作数及源操作数的类型也与SUB指令相同。8位或16位数运算均可。例如:SBB BX,1000SBB CX,DXSBB AL,DATA1SISBB DISPBP,BLSBB BYTE PTR SI+6,97 带借位减指令主要用于多字节的减法。 第4章 80 x86指令系统 减1指令DEC (DECrement by 1)。指令格式及操作:DEC dst ;(dst)(dst) 1 DEC指令将目的操作数减1,结果送回目的操作数。指令对状态标志位SF、ZF、AF、PF和OF有影响,但不影响进位标志CF。 操作数与INC一样,可以是寄存器或存储器(立即数和段寄存器不可)。其类型是字节操作或字操作均可。例如: DEC BLDEC CXDEC BYTE PTRBX DEC WORD PTRBPDI 第4章 80 x86指令系统 在循环程序中常常利用DEC指令来修改循环次数。例如: MOV AX,0FFFFHCYC:DEC AX JNZ CYC HLT 以上程序段中DEC AX指令重复执行65535(0FFFFH)次。此程序实际上是一段延时程序。 第4章 80 x86指令系统 求补指令NEG(NEGate)。指令格式及操作: NEG dst ;(dst)0 (dst) NEG指令的操作是用“0”减去目的操作数,结果送回原来的目的操作数。求补指令对状态标志位有影响。 操作数可以是寄存器或存储器。可以对8位数或16位数求补。例如:NEG BLNEG AXNEG BYTE PTRBPSINEG WORD PTRDI+20 第4章 80 x86指令系统 例4.4 内存数据段存放了200个带符号数,首地址为TAB1,要求将各数取绝对值后存入以TAB2为首址的内存区。 由于200个带符号数中可能既有正数,又有负数,因此先要判断正负。如为正数,可以原封不动地传送到另一内存区;如为负数,则需先求补即可得到负数的绝对值,然后再传送。程序如下: LEA SI,TAB1;(SI)源地址指针LEA DI,TAB2 ;(DI)目标地址指针 MOV CX,200 ;(CX)循环次数 第4章 80 x86指令系统 CHECK: MOVAL,SI ;取一个带符号数到ALORAL,AL ;AL内容不变,但使之影响标志JNSNEXT ;若(SF)=0,则转NEXTNEG AL ;否则求补NEXT:MOV DI,AL ;传送到目标地址INC SI ;源地址加1INC DI ;目标地址加1DEC CX ;循环次数减1JNZ CHECK ;如不等于零,则转CHECKHLT ;停止 第4章 80 x86指令系统 比较指令CMP (CoMPare)。指令格式及操作:CMP dst,src ;(dst) (src) CMP指令将目的操作数减源操作数,但结果不送回目的操作数。因此,执行比较指令以后,被比较的两个操作数内容均保持不变,而比较结果反映在状态标志位上,这是比较指令与减法指令SUB的区别所在。 第4章 80 x86指令系统 CMP指令的目的操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器,但不能同时为存储器。可以进行字节比较,也可以是字比较。例如:CMP AL,0AH ;寄存器与立即数比较CMP CX,DI ;寄存器与寄存器比较CMP AX,AREA1 ;寄存器与存储器比较CMP BX+5,SI ;存储器与寄存器比较 比较指令的执行结果将影响状态标志位。例如,若两个被比较的内容相等,则(ZF)=1。又如,假设被比较的两个无符号数中,前者小于后者(即不够减),则(CF)=1,等等。比较指令常常与条件转移指令结合起来使用,完成各种条件判断和相应的程序转移。 第4章 80 x86指令系统 例4.5 在数据段从MYDATA开始的存储单元中分别存放了两个8位无符号数,试比较它们的大小,并将大者传送到MAX单元。程序如下:LEABX,MYDATA;MYDATA偏移地址送BXMOVAL,BX ;第一个无符号数送ALINCBX ;BX指向第二个无符号数CMP AL,BX ;两个数比较JNC DONE ;如CF=0,则转DONEMOV AL,BX ;否则,第二个无符号数送ALDONE:MOV MAX,AL ;较大的无符号数送MAX单元 HLT ;停止 第4章 80 x86指令系统 (3) 乘法指令。8086/8088指令系统中有两条乘法指令,可以实现无符号数的乘法和带符号数的乘法,它们都只有一个源操作数,而目的操作数是隐含的。这两条指令都可以实现字节或字的乘法运算。进行乘法运算时,如果两个8位数相乘,那么其乘积最多为16位;如果两个16位数相乘,可得到32位的乘积。 需要指出的是,8086/8088 CPU在执行乘法指令时,有一个操作数总是放在累加器(8位数放在AL,16位数放在AX)中。8位数相乘时,其乘积(16位)存放在AX中;16位数相乘时,其乘积(32位)存放在DX:AX中,其中高16位存于DX中,低16位存于AX中,如图4.17所示。 第4章 80 x86指令系统 (16位)(16位)AXDX乘积乘数被乘数(8位)(8位)AX乘积乘数被乘数(16位)(32位)操作数AX操作数AL图4.17 乘法运算的操作数及运算结果 第4章 80 x86指令系统 无符号数乘法指令MUL (MULtiplication unsigned)。指令格式及操作: MUL src ;(AX)(AL) (src) (字节乘法) ;(DX:AX)(AX) (src)(字乘法) MUL指令对状态标志位CF和OF有影响,SF、ZF、
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!