汇编语言程序设计》第三章.ppt_第1页
汇编语言程序设计》第三章.ppt_第2页
汇编语言程序设计》第三章.ppt_第3页
汇编语言程序设计》第三章.ppt_第4页
汇编语言程序设计》第三章.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第3章 指令系统和寻址方式 汇编指令格式 寻址方式 8086指令系统 80X86及Pentium扩展指令,3.1 汇编指令格式,计算机中的一条指令通常包含两部分: 依据操作数的个数划分,80X86CPU指令系统中的指令格式最常用的有:双操作数指令、单操作数指令和无操作数指令。,1、双操作数指令汇编格式及操作规定 格式:标号: 操作符 OPD,OPS ;注释 操作规定: (1)OPD与OPS应为同种操作类型且类型明确,即同为字节类型或字类型。 (2)OPD不能是立即数。 (3)OPS和OPD不能同时为存储器操作数,即:或者是OPS和OPD中至少有一个为寄存器操作数,或者是OPD为存储器操作数,OPS为立即数。 (4)操作结束后,运算结果存入OPD中,OPS内容不变。,2、单操作数指令汇编格式及操作规定 格式:标号: 操作符 OPD ;注释 操作规定: (1)OPD类型必须明确即为字节类型或字类型,不能是模糊类型。 (2)操作对象为目的操作数,操作结束后结果存入OPD中。 (3)OPD不能是立即数,只能是寄存器操作数或存储器操作数。,3、无操作数指令汇编格式及操作规定 格式:标号: 操作符 ;注释 操作规定:指令中只有操作码,不含操作数,这 种指令有两种可能: (1)无需任何操作数。如停机指令、空操作指令等。 (2)所需操作数是隐含指定的,操作时取固定操作数进行操作。,返回,3.2 寻址方式,寻找指令中所需操作数存放地址的方式或程序转移时寻找转移地址的方式称为寻址方式,因而寻址方式分为两大类,一类是数据寻址方式,另一类是转移地址寻址方式。 由于80X86指令涉及四种操作数:立即操作数、寄存器操作数、存储器操作数和隐含操作数,因此,数据寻址方式又可对应四种寻址方式,即:立即寻址、寄存器寻址、存储器寻址和固定寻址。,1、立即寻址 此寻址方式所提供的操作数直接包含在指令中,它紧跟在指令操作码后面,存放在存储器代码段中。立即操作数可以是8位,也可以是16位。 汇编格式:n (n是用8位或16位二进制补码表示的有符号数) 【例3.1】 MOV AX,1234H 立即寻址方式用来表示常数,它常用于给寄存器赋初值。需要强调的是,立即寻址只能用于源操作数,不能用于目的操作数。,2、寄存器寻址 此寻址方式的操作数直接存放在由指令指明的寄存器中。在汇编指令中直接书写寄存器名,如16位寄存器操作数可以是AX、BX、CX、DX、SI、DI、BP、SP、DS、ES、SS、CS等;8位寄存器操作数可以是AH、AL、BH、BL、CH、CL、DH、DL。 汇编格式: R (其中R表示寄存器名) 此寻址方式由于存取操作数直接从CPU内部寄存器中获得,不需访问存储器,因而指令执行的速度快。 寄存器寻址既可用于源操作数,又可用于目的操作数,应用频率高。 【例3.2】 MOV DS,AX ADD CL,AH,3、存储器寻址 存储器寻址方式的操作数都是存放在存储器中,一般是数据段、附加段、堆栈段中的存储单元。指令中给出的是存储单元的地址或产生存储单元地址的表达式。在汇编语言源程序中,存储单元地址是采用逻辑地址的形式表示的,即:段首址:段内偏移地址。段首址存放在某个段寄存器中,段内偏移地址是指存放操作数的存储单元与段起始地址(段首址)之间的距离(字节数),又可称为“有效地址”,记作EA。有效地址EA是由3个地址分量的某种组合求得,这3个地址分量是:位移量 、基址 、变址 。 这3个地址分量的不同组合,使形成有效地址EA的方法不同,相应有以下5种不同的存储器操作数寻址方式。,(1)直接寻址 直接寻址是最简单的存储器寻址,这种寻址,操作数的有效地址EA由指令直接给出。它主要用于存取简单变量。 汇编格式:(a) 常量 (b)变量 或 含有变量的表达式 【例3.3】 MOV AL, 1000H MOV VAL,BX 对使用直接寻址方式需说明以下几点: 操作数默认存放在数据段中,段寄存器DS在指令格式无须指定。 若操作数在代码段、堆栈段或附加段中,则在指令格式中必须指定相应的段寄存器名。在操作数地址之前使用前缀指出段寄存器名,这种前缀称为段超越前缀。 指令中操作数的EA即可以是一个数字,也可以是一个符号地址。当EA是一个数字时,一定要注意立即寻址方式与直接寻址方式的区别。 直接寻址方式适合于处理存储器的单个存储单元。,(2)寄存器间接寻址 此寻址方式中,操作数的有效地址EA存放在SI、DI、BX或BP四个寄存器之一中,即:EA(BX)或(BP)或(SI)或(DI)。 汇编格式: R (其中R是寄存器SI、DI、BX、BP之一) SI、DI、BX、BP在这里叫间址寄存器。若用BX、SI或DI间址寻址时,则操作数默认在数据段中,且用DS内容作为段首址,操作数的物理地址为: (BX) PA(DS)16(SI) (DI) 【例3.4】 MOV DL, BX 若指令中使用BP间址寻址时,则操作数默认在堆栈段中,且用SS的内容作为段首址,操作数的物理地址为: PA(SS)16 (BP)。 【例3.5】 MOV BP ,AX,(5)基址加变址寻址 此寻址方式中操作数的有效地址EA是指令中的基址寄存器的内容、变址 寄存器的内容、位移量三个地址分量之和,即:EA(BX)(SI)位移量 (BP)(DI) 汇编格式:(a)Disp BX 或BPSI或DI (b) BX或BP SI或DIDisp 该寻址方式中若基址寄存器采用BX,则操作数默认在数据段中; 若基址寄存器采用BP,则操作数默认在堆栈段中,因而操作数的物理 地址为: PA (DS)16(BX)(SI)Disp (DI) (SS)16(BP)(SI)Disp (DI),4、80X86扩充的寻址方式 上述讲的8种8086CPU的16位寻址方式同样适用于80X86CPU32位寻址方式,在这8种32位寻址方式中,只不过是立即数、寄存器、存储器有效地址扩充到32位,而且任意32位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)均可作为间址寄存器、基址寄存器或变址寄存器(变址寄存器ESP除外)。 除此之外,80X86CPU32位寻址方式还提供了两种仅适用于32位CPU的寻址方式,即:比例变址寻址和基址加比例变址寻址,这两种寻址方式均属于存储器寻址方式中的一种,其操作数存放在存储器中。 (1) 比例变址寻址 由变址寄存器的内容乘以比例因子再加上位移量而得到操作数有效地址EA的寻址方式称为比例变址寻址, 即:EA 变址寄存器 比例因子位移量。 汇编格式: 变址寄存器 比例因子位移量,其中:变址寄存器是EAX、EBX、ECX、EDX、ESI、EDI、EBP之一;比例因子可以是1、2、4、8;位移量可以是0位、8位或32位。 此寻址方式操作数默认在数据段,若操作数不在默认的数据段中时,则应使用段超越前缀明确指定。 例如:MOV EAX,COUNT EDI*2 ;COUNT是位移量,2是比例因子 其中乘以比例因子的操作是在CPU内部由硬件完成。 (2) 基址加比例变址寻址 由变址寄存器的内容乘以比例因子加上基址寄存器的内容再加上位移量而得到操作数有效地址EA的寻址方式称为基址加比例变址寻址。 即:EA 变址寄存器 比例因子 基址寄存器 位移量。 若基址寄存器采用EBP、ESP时,则操作数默认在SS段中,若基址寄存器采用除EBP、ESP以外的其他寄存器时,则操作数默认在DS段中。若操作数不在相应的默认段中时,则应使用段超越前缀明确指定。 例如:MOV ESI*4EDX ,EAX ;目的操作数在DS段中,5、转移地址寻址方式 转移地址寻址方式确定的是转移指令或调用指令转移后的地址。 可将转移地址寻址方式分为四种:段内直接寻址、段内间接寻址、段间直接寻址和段间间接寻址。 (1) 段内直接寻址 段内直接寻址又称为段内相对寻址。在此寻址方式下,转移后的指令与转移指令本身在同一代码段中。转移后指令的有效地址EA(IP)位移量。若位移量为正,则相对本指令向后转移,若为负,则相对本指令向前转移。 汇编格式:(a)SHORT 标号 (b)NEAR PTR 标号 其中:标号是符号地址。 例如:JMP SHORT NEXT JMP NEAR PTR L1,(2) 段内间接寻址 转移有效地址是一个字寄存器或是一个字存储单元的内容。这个字寄存器或字存储单元的内容可以用数据寻址方式中的寄存器寻址或存储器寻址获得,所得到的转移有效地址用来取代当前的IP值实现段内间接寻址。这种寻址方式只适用于JMP和CALL指令。 汇编格式:(a) R (R为16位通用寄存器) (b) 存储器寻址方式之一 若JMP和CALL指令采用格式(a),即寄存器寻址,则指令中指定的寄存器内容便是转移地址,当CPU执行JMP或CALL指令时,就将该寄存器的内容装入IP。 若JMP和CALL指令采用格式(b)中的一种存储器寻址时,则转移地址便是字存储单元的内容,当CPU执行JMP或CALL指令时,就将该字存储单元的内容装入IP。,(3) 段间直接寻址 此寻址方式,转移后的指令与转移指令本身不在同一代码段中。转移地址(即IP和CS值)由指令直接给出。 汇编格式: FAR PTR 标号 它只适用于JMP和CALL指令。例如:JMP L2(标号L2与本JMP指令不在同一代码段中)。 (4)段间间接寻址 此寻址方式也只适用于JMP和CALL指令。转移后的指令与转移指令本身不在同一代码段中。转移地址(即IP和CS值)由采用存储器寻址方式之一确定的双字存储单元内容间接给出。 汇编格式: 存储器寻址方式之一 执行JMP或CALL指令时,根据指令中指定的某种存储器寻址方式找到内存的一个双字(32位),将高字内容装入CS,将低字内容装入IP,实现段间转移。 例如: JMP DWORD PTR BX ,返回,3.3 8086指令系统,8086指令系统按功能可分为六大类: (1)数据传送类指令 (2)算术运算类指令 (3)位操作指令 (4)串操作指令 (5)控制转移指令 (6)处理器控制指令 8086指令按操作数个数可划分为三种类型: (1)双操作数指令 (2)单操作数指令 (3)无操作数指令 学习汇编指令应从以下几方面着重理解掌握: (1)学习指令格式; (2)掌握指令中操作数的寻址方式及寻址方式的搭配规则; (3)掌握指令的功能及指令执行后对条件码的影响; (4)学习如何正确运用指令。,一、数据传送指令,1通用数据传送指令 (1)传送指令MOV 格式:MOV OPD,OPS 功能:把源操作数传送到目的操作数。即:OPD(OPS) 说明: 源操作数和目的操作数的操作类型必须明确且一致;当指令中只有一个操作数的类型明确时,另一个操作数被视为同一类型;当两操作数类型均不明确时,必须用“BYTE PTR”或“WORD PTR”将一个存储器操作数定义为字节或字类型。 指令执行后,源操作数内容不变。 指令执行后,对标志寄存器各位无影响。 源操作数可以是通用寄存器、段寄存器、存储器和立即数;目的操作数也可以是通用寄存器、段寄存器、存储器,但立即数、CS段寄存器不能作为目的操作数。源操作数和目的操作数不能同时为存储器操作数。,用一条MOV指令能实现: (a) 立即数传送到通用寄存器或存储单元 如 MOV DL,a 、 MOV AX,1FA4H (b) 寄存器之间的传送 如 MOV AX,BX 、 MOV AL,DH 、 MOV DS,AX (c) 寄存器与存储单元之间的传送 如 MOV DL,BUFBYTE MOV WORD PTR BX+SI,AX 由于MOV指令中只允许一个操作数在存储器中,因此用一条MOV指令无法完成两个存储单元之间的数据传送,但可以用二条指令来实现。 【例3.9】 把BUFWORD1字单元内容传送到BUFWORD2字单元中,可用以 下指令完成: MOV AX,BUFWORD1 MOV BUFWORD2,AX,(2) 交换指令XCHG 格式:XCHG OPD,OPS 功能:源操作数和目的操作数的内容相互交换。 即:(OPD)(OPS) 说明:该指令与MOV指令相似,但在功能上有两点区别, 其一,该指令不允许使用立即数和段寄存器作为操作数; 其二,该指令改变源操作数的内容。 (3)查表转换指令XLAT 格式:XLAT 或 XLAT OPS 功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据 传送到AL中。即:AL(BXAL)字节,2地址传送指令 地址传送指令主要用于将存储器操作数地址(偏移地址、段地址)传送给指定的寄存器。它包括3条指令:LEA、LDS和LES。 (1)传送有效地址指令LEA 格式:LEA REG16,OPS 功能:将源操作数的有效地址EA传送给目的操作数指定的16 位通用寄存器。 说明: 源操作数必须是存储器操作数,即OPS采用存储器寻址; 目的操作数必须是一个16位通用寄存器。 本指令对标志位无影响。 该指令通常用来建立内存储器的寄存器指针。,(2)传送偏移地址及数据段首址指令LDS 格式:LDS REG16,OPS 功能:将由源操作数确定的双字存储单元的内容传送给DS及目的操 作数指定的16位通用寄存器中,其中高字单元的内容送给 DS,低字单元的内容送给REG16。 说明: 源操作数必须是双字存储器操作数,即:OPS采用存储器 寻址,寻找到相继4个字节的存储单元,低字单元中存放 偏移地址,高字单元中存放段首地址;目的操作数必须是 一个16位通用寄存器,通常特定为SI。 本指令不影响标志位。 (3)传送偏移地址及附加段首址指令LES 格式:LES REG16,OPS 功能:将由源操作数确定的双字存储单元的内容传送给ES及目的操 作数指定的16位通用寄存器中,其中高字单元的内容送给 ES,低字单元的内容送给REG16。 说明:同LDS指令。,3标志位传送指令 标志位传送指令有4条指令,即:LAHF、SAHF、PUSHF和POPF。 (1)标志送AH指令LAHF 格式:LAHF 功能:将标志寄存器低8位的内容送入AH寄存器。 即:AH(FLAGS)7-0,该指令的执行不影响标志位。 (2)AH标志送指令SAHF 格式:SAHF 功能:将AH寄存器的内容送入标志寄存器低8位,高8位保持不变。 该指令用于设置或恢复SF、ZF、AF、PF、CF五个标志位, 该指令的执行只影响标志寄存器的低8位,对高8位(即OF、 DF、IF、TF)标志位无影响。 从指令的功能上可看出,SAHF和LAHF为互逆过程。,(3)标志进栈指令PUSHF 格式:PUSHF 功能:将标志寄存器的内容压入堆栈。 (4)标志出栈指令POPF 格式:POPF 功能:将栈顶字单元内容弹出到标志寄存器中。 该指令的执行影响标志位。 PUSHF和POPF互为逆过程。 标志位传送指令中SAHF和POPF指令将直接影响标志寄存器的内容。利用这一特性,可以方便地改变标志寄存器中指定位的状态. 数据传送类指令还包括输入/ 输出专用指令,在PC机里所有I/O端口与CPU之间的通信都由IN和OUT指令实现,由IN指令完成从I/O端口到CPU的信息传送,由OUT指令完成从CPU到I/O端口的信息传送。,二、算术运算指令,算术运算指令用来执行加、减、乘、除四则运算。它包括无符号数、有符号数的二进制算术运算指令和十进制算术运算调整指令。 1二进制数算术运算指令 (1)加法运算指令 加法运算指令包括ADD、ADC的INC三条指令。 加法指令ADD 格式:ADD OPD,OPS 功能:将目的操作数与源操作数相加,结果存入目的地址中,而源 操作数不变。即:OPD(OPD)(OPS)。 说明:该指令的源操作数或在通用寄存器或在存储单元中,也可以是立即数,而目的操作数只能在通用寄存器或存储单元中,不能是立即数,且两操作数不能同时为存储器操作数;操作数可以是字节或字,且两操作数的类型明确并一致。该指令相加后,根据得到的结果设置标志寄存器的OF、SF、ZF、CF、AF和PF标志位。 ADD指令执行后对标志位的影响及作用如下,这里我们只重点说明OF、CF、SF和ZF四个标志位。,OF: 当两个有符号数相加时,若两个操作数的符号相同,而结 果的符号与之相反,则OF1,否则,其余情况OF0。 当OF1时,说明两个有符号数相加产生了溢出,即和的 值超出了有符号数的有效范围。在把操作数视为有符号数 时,可通过该标志了解加法结果是否正确。 CF: 运算过程中当最高位产生进位时,则CF1,否则,CF0。 当CF1时,说明运算结果超出了无符号数的表示范围。 在把操作数视为无符号数时,可通过该标志了解加法结果 是否正确。 SF: 运算结果的最高位为1,则SF1,否则,SF0。 ZF: 运算结果为零时,则ZF1;否则,ZF0。, 带进位加法指令ADC 格式:ADC OPD,OPS 功能:与ADD指令基本相同,惟一区别是将该指令执行前的CF值 加至目的操作数中。即:OPD(OPD)(OPS)CF 说明:该指令与ADD指令在功能上及结果对标志位影响上基本相 同。该指令主要用于多字节的加法运算。 加1指令INC 格式:INC OPD 功能:将目的操作数加1后送回目的地址中,并根据执行结果设 置标志位OF、SF、ZF、AF、PF,但不影响CF位。 说明:该指令的操作数可以是字或字节且类型必须明确。其操作 数只能在通用寄存器或存储单元中,不能是立即数。该指 令执行后对OF、SF、ZF、AF、PF标志位的影响与ADD指令 相同。 INC主要用于计数器的计数或修改地址指针。,(2)减法运算指令 减法运算指令包括SUB、SBB、DEC、NEG和CMP五条指令。 减法指令SUB 格式:SUB OPD,OPS 功能:目的操作数减去源操作数,其差值存入目的地址,源操作 数不变,即:OPD(OPD)(OPS)。并按相减的结果设 置标志位OF、CF、SF、ZF、AF和PF。 说明:该指令的源操作数和目的操作数可以在通用寄存器或存储单元中,但两者不能同时在存储器中,立即数可作为源操作数,而不能作为目的操作数。两操作数可以是字节或字,且类型明确一致。 SUB指令执行后对标志位的影响与ADD指令类似,下面仅说明CF和OF两位的设置情况及作用: OF:当两个有符号数相减时,若两个操作数的符号相反,而结果的 符号与减数相同,则OF1,否则,其余情况OF0。 OF1时,说明有符号数减法溢出,结果是错误的。OF位可用来 判断有符号数相减,结果是否正确。 CF:当两无符号数相减时,若减数大于被减数,则此时有借位, CF1,否则CF0,CF值反映了无符号数相减时是否有借位。, 带借位减法指令SBB 格式:SBB OPD,OPS 功能:SBB与SUB指令基本相同,惟一区别是:目的操作数除减去源 操作数外,还要减去该指令执行前的CF值。 即:OPD(OPD)(OPS)CF。并按相减的结果设置标志 位OF、CF、SF、ZF、AF和PF。 说明:该指令与SUB指令在功能上及结果对标志位的影响上基本相同。 该指令在使用上类似于ADC指令,主要用于多字节减法运算。 SUB和SBB指令配合可以实现多倍精度数减法运算。 减1指令DEC 格式:DEC OPD 功能:将目的操作数减1后送入目的地址中,并根据执行结果设置标志 位OF、SF、ZF、AF和PF,但不影响CF位。即OPD(OPD)1。 说明:该指令的操作数可以是字节或字且类型必须明确;其操作数只 能在通用寄存器或存储单元中,不能是立即数。该指令执行后 对OF、SF、ZF、AF、PF的影响与SUB指令相同。, 求负数指令NEG 格式:NEG OPD 功能:用零减去目的操作数,相减结果送回目的地址中。 即:OPD0(OPD)(OPD) 即求目的操作数的相反数。 说明: (a)该指令是单操作数指令,OPD的用法与前面讲过的单操作数指 令,如INC、DEC)中的目的操作数相同。 (b)NEG指令是对有符号数进行操作的,由于机器中有符号数是用 补码表示的,求一个操作数的负数,就是求其补码,因此, NEG又叫求补指令,即:OPD(OPD)1。 (c)该指令执行后影响标志位CF、OF、SF、ZF、AF和PF。其中: OF:当字节操作数为128(80H),字操作数为32768 (8000H),执行NEG指令后,操作数无变化,但溢出标志 位OF置1,其余情况OF置0。 CF:当操作数为零时,求负数的结果仍为零,CF0, 其余情况CF1, 比较指令CMP 格式:CMP OPD,OPS 功能:目的操作数减去源操作数,结果只影响标志位,不送入目的地址 即:(OPD)(OPS)。 说明:CMP指令与SUB指令一样执行减法操作,但它不保存差值结果, OPD和OPS在操作前后值不变。CMP指令功能上、使用方法上、对 标志位的影响上均与SUB指令基本相同。 CMP指令常用于比较两个操作数的大小。执行CMP指令后,根据标志位的设置情况判断两个数的大小关系。 若两无符号数比较时:当ZF0时,则 OPDOPS; 否则:当CF0时,则OPDOPS; 当CF1时,则OPDOPS。 若两有符号数比较时:当ZF0时,则OPDOPS; 否则:当OFSF时,则OPDOPS; 当OFSF时,则OPDOPS。 CMP指令后面常跟着条件转移指令,根据比较结果产生不同的分支。,(3)乘法运算指令 乘法指令用于实现两个二进制操作数的乘法运算,乘法指令区别无符号数和有符号数,所以它提供了两条指令:MUL和IMUL。 无符号数乘法指令MUL 格式:MUL OPS 功能:实现两个无符号数相乘。 字节乘:当OPS为字节操作数时,将(AL)乘以(OPS), 得到字乘积送入AX中,即:AX(AL)(OPS)。 字乘: 当OPS为字操作数时,将(AX)乘以(OPS),得到双 字乘积,高字部分送入DX中,低字部分送入AX中。 即:DX,AX(AX)(OPS)。 说明: (a)MUL指令有两种操作类型,即字节乘和字乘,MUL操作类型取决于OPS的类型,OPS指定乘数,它可以是字节或字,但类型必须明确,乘数可以在通用寄存器或存储器中,但不能是立即数。 (b)MUL指令只影响OF和CF位。,若乘积的高一半(即字节相乘时乘积中的(AH),字相乘时乘积中的(DX)为0,则OFCF0,否则OFCF1。MUL指令对其它标志位不确定。当CFOF1时,说明AH或DX中有乘积的有效数字,CFOF0时,说明AH或DX中无乘积的有效数字,也就是说字节乘以字节积为字节或字乘以字积为字。编程时我们可以利用OF和CF位的设置情况检查字节乘时乘积的结果是字节还是字,字乘时乘积的结果是字还是双字。 有符号数乘法指令IMUL 格式:IMUL OPS 功能:实现了两个有符号数相乘。其操作方法与MUL指令相同。 说明:IMUL指令也只影响OF和CF位,对其它标志位不确定。若乘积 的高一半(即AH或DX)是低一半(即AL或AX)的符号扩展, 则OFCF0,否则,OFCF1。当OFCF1亦标志着AH或 DX中放有乘积的有效值,即标志着(AH)和(DX)不是对应 的低半部分的符号扩展。,(4)除法运算指令 除法指令用于实现两个二进制操作数的除法运算,包括无符号 数除法指令DIV和有符号数除法指令IDIV。 无符号数除法指令DIV 格式:DIV OPS 功能:实现两无符号数除法运算,商和余数均为无符号数。 字节除:当OPS为字节操作数时,则以(AX)为被除数,OPS为 除数,将(AX)除以(OPS),得到的商送入AL中,余 数送入AH中。即:(AX)/(OPS) AL(商) AH(余数) 字除:当OPS为字操作数时,则以(DX,AX)为被除数,OPS为 除数,将(DX,AX)除以(OPS),得到的商送入AX中, 余数送入DX中。即:(DX,AX)/(OPS) AX(商) DX(余数),说明: (a)DIV指令有两种操作类型,即字节除和字除,其操作类型取决于OPS的类型,OPS指定除数,它的类型必须明确,它可以在通用寄存器或存储器中,但不能是立即数。DIV指令的被除数、商和余数均采用隐含寻址方式,当字节除时,被除数隐含在AX中,商固定存入AL中,余数固定存入AH中;当字除时,被除数隐含在DX,AX中,商固定存入AX中,余数固定存入DX中。 (b)DIV指令执行后,标志寄存器中各标志位不确定,但商可产生溢出。一般情况下,当被除数的高一半(即字节除时为(AH),字除时为(DX)大于除数时,商就会产生溢出。当OPS为字节操作数时,商的范围为0255(0FFH);当OPS为字操作数时,商的范围为065535(0FFFFH)。若商超出此范围,则产生0号中断(除法出错中断),转入除法出错中断处理。, 有符号数除法指令IDIV 格式:IDIV OPS 功能:实现两有符号数除法运算,该指令中的操作数、商及余数均为 有符号数且用补码表示,除此之外,其余操作与DIV完全相同。 说明:(a)IDIV指令商的符号由被除数符号与除数符号异或运算而 得到,余数的符号规定与被除数的符号相同。 (b)有符号数除法的商中,最大的正数商是127(7FH)或32767 (7FFFH),最小的负数商是127(81H)或32767(8001H)。 当商超出此范围,指令产生了溢出。一般情况下,当被除数高一 半(AH或DX)的绝对值大于除数的绝对值时,则可判断IDIV指令 操作结果产生了溢出,即产生0号中断。 字节转换成字指令CBW 格式:CBW 功能:将(AL)的符号位扩展到AH中。 字转换成双字指令CWD 格式:CWD 功能:将(AX)的符号位扩展到DX中。,2十进制算术运算调整指令 十进制算术运算调整指令又称为BCD码调整指令。当用计算机进行十进制算术运算时,可以先将操作数作十二进制转换,然后作二进制数算术运算,再将结果作二十进制转换。为了方便十进制数的运算,8086系统提供了一组十进制算术运算调整指令,用于将运算后的二进制数调整为BCD码。该类指令分为压缩BCD码调整指令和非压缩BCD码调整指令。 注意:十进制调整指令不能单独使用,必须与加、减、乘、除二进制指令配合使用才能进行十进制调整,十进制调整指令形式上均为无操作数指令,其操作对象隐含在AX中。 (1)非压缩BCD码调整指令 非压缩BCD码加法调整指令AAA。 格式:AAA 功能:将AL中的和调整为非压缩BCD码并送回AL。具体调整方法如下: 若二进制相加后(AL)的低4位大于9或AF=1,则:AL(AL)+ 6; AH(AH)+ 1; AF = CF = 1 且AL高4位清零。否则:CF = AF = 0 且AL高4位清零。其他标志位OF、PF、SF、ZF不确定。 说明:在使用AAA指令前,必须执行ADD、ADC或INC指令把非压缩BCD相 加,且把和存放在AL中。, 非压缩BCD码减法调整指令AAS。 格式:AAS 功能:将AL中的差调整为非压缩BCD码并送回AL,向高位的借位在AH和 CF中。具体调整方法如下: 若二进制相减后(AL)的低4位大于9或AF=1, 则:AL(AL)- 6; AH(AH)- 1;AF = CF = 1 且AL高4位清 零。否则:CF = AF = 0且AL高4位清零。其他标志位OF、PF、SF、 ZF不确定。 说明:在使用AAS指令前,必须执行SUB、SBB或DEC指令把非压缩BCD相 减,且把差存放在AL中。 非压缩BCD码乘法调整指令AAM。 格式:AAM 功能:将AL中的积调整为非压缩BCD码并送回AX。具体调整方法是: 把AL寄存器的内容除以0AH,并把商放在AH寄存器中,余数放 在AL寄存器中。 非压缩BCD码除法调整指令AAD。 格式 :AAD 功能:除法运算前,先调整被除数AX内容, 使:AL(AH)* 0AH +(AL) , AH 0,(2)压缩BCD码调整指令 压缩BCD码加法调整指令DAA。 格式:DAA 功能:将AL中的和调整为压缩BCD码并送回AL。本指令执行之前必须先 执行ADD或ADC指令,把两个压缩BCD码相加,且和存放在AL寄存 器中。具体调整方法是: 若(AL)的低4位大于9或AF=1,则:AL(AL)+ 06H,并使AF=1; 若(AL)的高4位大于9或CF=1,则:AL(AL)+ 60H,并使CF=1; 其余情况AL内容不变。 说明:DAA指令影响CF、ZF、SF、AF和PF,对OF无定义。 压缩BCD码减法调整指令DAS。 格式:DAS 功能:将AL中的差调整为压缩BCD码并送回AL。本指令执行之前必须先 执行SUB或SBB指令,把两个压缩BCD码相减,且差存放在AL寄存 器中。具体调整方法是: 若(AL)的低4位大于9或AF=1,则:AL(AL)- 06H,并使AF=1; 若(AL)的高4位大于9或CF=1,则:AL(AL)- 60H,并使CF=1; 其余情况AL内容不变。 说明:DAS指令影响CF、ZF、SF、AF和PF,对OF无定义。,三、位操作指令,8086提供的位操作指令包括逻辑运算指令和移位指令,这类指令可直接对寄存器或存储器中的位进行操作。 1逻辑运算指令 逻辑运算指令包括:AND指令、OR指令、XOR指令、TEST指令和NOT指令,其中前四种指令是双操作数指令,符合双操作数指令的一般规律,这四条指令执行后将使CF和OF位为0,AF位不确定,而SF、ZF和PF位则根据运算结果设置;NOT指令是单操作数指令,符合单操作数指令的一般规律,它的执行不影响标志位。 (1)逻辑与指令 格式:AND OPD,OPS 功能:将目的操作数与源操作数按位相与,结果送目的操作数。 即:OPD(OPD)(OPS)。 说明: “与”的运算原则是:11=1,01=0,10=0,00=0。 AND指令常用于: (a)使一个操作数中的若干位保持不变,而若干位清为0的场合。 (b)某一操作数,自己和自己相“与”,操作数不变,但可以使进 位标志CF清0。,(2)逻辑或指令 格式:OR OPD,OPS 功能:将目的操作数与源操作数按位相或,结果送目的操作数。 即:OPD(OPD)(OPS)。 说明: “或”操作的运算原则是:11=1,01=1,10=1,00=0。 OR指令常用于: (a) 使一个操作数中的若干位保持不变,而另外若干位置1的 场合。这时,要保持不变的这些位与“0”相或;而要置1 的这些位与“1”相或。 (b) 某一操作数,自己和自己相“或”,操作数不变,但可以 使进位标志CF清0。 (3)逻辑异或指令 格式:XOR OPD,OPS 功能:将目的操作数与源操作数按位相异或,结果送目的操作数。 即:OPD(OPD)(OPS)。,说明: “异或”操作的运算原则是:11=0,00=0,01=1,10=1。 XOR指令常用于: (a) 使一个操作数中的若干位保持不变,而另外若干位取反的场 合。这时,要保持不变的这些位与“0”相异或;而要取反的 那些位与“1”相异或。 (b) 使某一操作数清0。由于一个操作数自身做“异或”时,每一 位都相同,“异或”结果必为0,且使进位标志也为0。因此这 是使操作数的初值置0的常用的有效的方法。 如指令XOR AX,AX使AX清0。 (c) 测试某一操作数是否与另一确定的操作数相等。这种操作在 检查地址是否匹配时是常用的。 (4)测试指令 格式:TEST OPD,OPS 功能:目的操作数与源操作数按位相与,结果反映在标志位上, 但不送回目的操作数。 即:(OPD)(OPS)。,说明: 该指令完成与AND指令相同的操作,但TEST指令不改变目的操 作数的值。 TEST指令常用于:在不希望改变原有的操作数的情况下,用来 检测某一位或某几位的条件是否满足。编程时常与条件转移指 令一起使用,可在TEST指令后面加上条件转移指令,来测试操 作数某位是否为1,或者是否为0。 (5)逻辑非指令 格式:NOT OPD 功能:将目的操作数各位取反,结果送目的操作数。 即:OPD(OPD)。 说明:若将整个操作数取反,则应使用NOT指令,若只需将操作数 的一部分位取反,则应使用XOR指令。 总之,逻辑运算指令对字或字节执行按位操作,主要用于将字或 字节的指定位进行置“1”、清“0”、取反的操作、测试字或字节指定的 位,以及对字、字节数据进行拆分与拼装操作。,2移位指令 移位指令包括逻辑移位指令、算术移位指令和循环移位指令。这些指令都对目的操作数按操作符规定的方式向左或向右移动指定位数的操作。 (1)逻辑左移指令 格式:SHL OPD,COUNT 功能:将目的操作数向左移动COUNT指定的位数,每左移一位,最低位 补0,最高位送CF。 (2)逻辑右移指令 格式:SHR OPD,COUNT 功能:将目的操作数向右移动COUNT指定的位数,每右移一位,最高位 补0,最低位送CF。 (3)算术左移指令 格式:SAL OPD,COUNT 功能:SAL指令与SHL指令的功能完全相同。 (4)算术右移指令 格式:SAR OPD,COUNT 功能:将目的操作数向右移动COUNT指定的位数,每右移一位,最高位 均保持不变,最低位送CF。,(5)循环左移指令ROL 格式:ROL OPD,COUNT 功能:将目的操作数向左循环移位COUNT指定的位数,每左移一位, 左移前的最高送最低位以及CF。 (6)循环右移指令ROR 格式:ROR OPD,COUNT 功能:将目的操作数向右循环移位COUNT指定的位数,每右移一位, 右移前的最低送最高位以及CF。 (7)带进位的循环左移指令RCL 格式:RCL OPD,COUNT 功能:将目的操作数连同CF位一起向左循环移位COUNT指定的位数, 每左移一位,左移前的CF送最低位,左移前的最高位送CF。 (8)带进位的循环右移指令RCR 格式:RCR OPD,COUNT 功能:将目的操作数连同CF位一起向右循环移位COUNT指定的位数, 每右移一位,右移前的CF送最高位,右移前的最低送CF。,四、处理器控制指令,1 标志位操作指令 (1)清除进位标志指令 (2)进位标志置位指令 CLC ;置CF0 STC ;置CF1 (3)进位标志取反指令 CMC ;CF取反 (4)清除方向标志指令 (5)方向标志置位指令 CLD ;置DF0 STD ;置DF1 (6)清除中断标志指令 (7)中断标志置位指令 CLI ;置IF0 STI ;置IF1 2 处理器控制指令 (1)空操作指令 格式:NOP 功能:CPU执行一次空操作 。 (2) 暂停指令 格式:HLT 功能:使CPU进入暂停状态,不进行任何操作 。 (3)等待指令 格式:WAIT 功能:使CPU处于等待状态 。,返回,3.4、80X86及Pentium扩展指令,80x86及Pentium处理器的指令系统都包括了各自前期处理器的全部指令,并在此基础上对前期处理器的指令系统进行了增强和扩展。 1、80286增强和扩展指令 80286指令系统除了包括所有的8086指令及对上述部分指令进行了功能扩展之外,还新增了一些指令,并在原有工作模式基础上增加了一种新的工作模式,即保护虚地址模式。 (1) 80286工作模式 (a)实地址模式。80286系统上电启动后,就进入了实地址模式,在此模式下,80286与8086在目标代码一级是向上兼容的,存储器最大的可访问空间为1MB,CPU产生20位物理地址的方法、段的结构以及存储区中专用单元和保留单元均与8086相同。在实地址模式下,用LMSW指令设置机器状态字MSW中的PE标志,可进入保护虚地址模式。 (b)保护虚地址模式。该工作模式是集实地址模式的能力、存储器管理、对虚拟存储器的支持和对地址空间的保护为一体而建立起来的一种特殊工作方式。保护虚地址模式下的寄存器功能、指令功能及寻址方式等与实模式相同,8086的程序及80286在实地址模式下的程序都可以在保护虚地址模式下运行。,(2) 80286扩展指令 (a)堆栈操作指令 PUSH 16位立即数 将16位立即数压入堆栈,该指令不影响状态标志位。该指令中立即数如果给出的数不够16位,则自动扩展为16位后压入堆栈。 PUSHA 将所有通用寄存器AX,CX,DX,BX,SP,BP,SI,DI的内容按顺序压入堆栈,入栈的SP值是执行该指令之前SP的值,在执行完本指令后,SP值减16。 POPA 将栈顶的内容顺序弹至DI,SI, BP,SP,BX,DX,CX,AX(次序与PUSHA指令相反)。SP中的值是堆栈中所有通用寄存器弹出后,堆栈指针实际指向的值(不是栈中保存的SP值),也即该指令执行后SP的值,可以通过加16来恢复。 PUSHA及POPA均不影响状态标志位。,(b) 有符号整数乘法指令。 IMUL 16位寄存器,立即数 将16位通用寄存器中的有符号数作为被乘数,与有符号立即数相乘,乘积送回通用寄存器。若乘积超出字有符号数的表示范围 (-32768-+32767),除丢失溢出部分外,并将OF及CF置为1;否则,将OF及CF置为0。 IMUL 16位寄存器,16位寄存器,立即数 该指令与上一条指令功能类似,区别仅在于将16位存储器操作数作为被乘数与立即数相乘,结果送16位寄存器。 (c)移位指令。 8086中有8条移位指令,移位计数使用CL或1表示,且规定当移位次数大于1时,必须使用CL。在80286中,则修改了上述的限制,当移位次数为,131次时,允许使用立即数。例如:ROR BX,7。,2、80386增强和扩展指令 80386微处理器是Intel公司80x86发展史上的里程碑,它不但兼容8086,80186,80286微处理器,而且也为后来的80486,Pentium,Pentium Pro的发展打下了坚实的基础。 80386指令系统包括了所有80286指令,并对80286的部分指令进行了功能扩充,还新增了一些指令,特别指出的是,80386提供了32位寻址方式,可对32位数据直接操作。所有16位指令均可扩充为32位指令。80386有8个32位通用寄存器:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。它们分别是原来的16位通用寄存器AX,CX,DX,BX,SP,BP,SI,DI的扩展。对于数据段寄存器,80386在原有基础上增加了两个:FS和GS。 80386有实地址模式、保护虚地址模式和虚拟8086模式三种工作方式,在DOS环境中只能运行实模式,可做为超高速8086芯片使用。 80386的标志寄存器扩展到了32位,其中某些位没有定义。80386在实地址模式下有9个标志位可用,在保护虚地址模式下有13个标志位可用,扩展后的标志寄存器称为EFLAGS。,(1) 数据传送指令 (a)MOVSX 寄存器,寄存器/存储器 将源操作数传送到目的操作数中。目的操作可以是16位或32位寄存器;源操作数可以是寄存器或存储器操作数,其位数应小于或等于目的操作数的位数。当源操作数的位数少于目的操作数时,目的操作数的高位用源操作数的符号位填补。,此指令适用于有符号数的传送与扩展。该指令不影响状态标志位。 (b)MOVZX 寄存器,寄存器/存储器 与MOVSX功能基本相同,惟一区别在于,当源操作数的位数少于目的操作数位数时,目的操作数的高位用“0”填补。该指令适用于无符号数的传送与扩展。,(2) 堆栈操作指令 (a)PUSH 32位立即数 将32位立即数压入堆栈。该指令执行后SP的值将减4。通常使用以下方法来区别操作数是8位,16位还是32位立即数:PUSH 23H,PUSHW 14H,PUSHD 45H。 (b)PUSHAD 将所有通用寄存器EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI的内容顺序压入堆栈,其中压入堆栈的ESP是该指令执行前ESP的值。执行该指令后,ESP值减32。 (c)POPAD 将当前栈顶内容顺序弹至EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX(次序与PUSHAD指令相反),但是最终ESP的值为弹出操作对堆栈指针调整后的值(而不是堆栈中保存的ESP的值)。即执行该指令后ESP的值,可以通过增加32来恢复。 (d)PUSHFD 将32位标志寄存器EFLAGS的内容压入堆栈。 (e)POPFD 将当前栈顶的4字节内容弹至EFLAGS寄存器。 上述堆栈操作指令中,除POPFD以外,其余均不影响状态标志位。,(3) 地址传送指令 (a)LFS 寄存器,存储器 将源操作数所指存储单元的4字节或6字节内容送指定的寄存器及段寄存器FS。 当目的操作数为16位寄存器时,将4字节的存储器操作数中的低两字节送指定寄存器,高两字节送段寄存器FS;当目的操作数为32位寄存器时,将6字节的存储器操作数中的低4字节送指定寄存器,高两字节送段寄存器FS。该指令不影响状态标志位。 (b)LGS 寄存器,存储器 该指令与LFS指令功能基本相同,惟一区别是该指令所涉及的段寄存器为GS。 (c)LSS 寄存器,存储器 该指令与LFS指令功能基本相同,惟一区别是该指令所涉及的段寄存器为SS。,(4) 有符号数乘法指令 (a)IMUL 寄存器,寄存器/存储器 将16位或32位通用寄存器中的有符号数作为被乘数,相同位数通用寄存器或存储单元中的有符号数作为乘数,乘积送目的操作数。若乘积溢出,溢出位部分将丢失,且将OF及CF置1,否则将OF及CF置0。 注意:目的操作数的位数必须与源操作数位相同。 (b)IMUL 寄存器,寄存器存储器,立即数 与前一指令功能基本相同,惟一区别是寄存器/存储器为被乘数,立即数为乘数,乘积存放在第一个操作数中。 (5) 符号扩展指令 (a)CWDE 将AX中16位有符号数的符号位扩展到EAX的高16位中,即把AX的16位有符号数扩展为32位后,送EAX。 (b)CDQ 将EAX中32位有符号数扩展到EDX:EAX寄存器对中,使之成为64位有符号数, 即将EAX中的符号位扩展到EDX中。,(6) 位操作指令 (a)位测试及设置指令 BT 寄存器/存储器地址,寄存器/立即数 第一操作数指定要测试的内容,第二操作数指定要测试的位,将被测内容的指定测试位的值送CF,其他状态标志不确定。 BTC 寄存器/存储器地址,寄存器/立即数 该指令在BT指令功能的基础上,将被测位取反。 BTR 寄存器/存储器,寄存器/立

温馨提示

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

评论

0/150

提交评论