版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第4章 指令系统24.1 80X86指令系统的 寻址方式3一、与数据有关的寻址方式 指令系统是全体指令的集合。通常,一条指令由操作码和操作数两个部分构成。操作码说明指令完成的功能,操作数说明指令操作的对象。对于操作数而言,最重要的问题是如何寻找到操作数,即寻址方式的问题。 4寻址方式就是指令中用于说明操作数所在地址 的方法,或者说是寻找操作数有效地址的方法。寻址方式大致可分为与数据有关的寻址和与转 移地址有关的寻址两大类指令中应包含的信息:56 操作数包含在本条指令当中,这种操作数称为 立即数;操作数存放在CPU的某个寄存器中,这种操作数称为寄存器操作数;操作数存放在存储器中,这种操作数称为
2、存储器操作数或内存操作数。7与数据有关的寻址方式这种寻址方式用来确定操作数地址从而找到操作数。在80X86系列中,8086和80286的字长是16位,一般情况下只处理8位和16位数,只是在乘、除指令中才会有32位数;80386及其后继机型其字长为32位,因此它除可处理8位和16位操作数外,还可处理32位操作数,在乘除法情况下可产生64位数。本节下面所述例子,如处理的是32位数,则适用于386及其后继机型。数据寻址方式的讨论中均以“MOV d,s”为例,这是传送指令,第1操作数为目的操作数d,第2操作数为源操作数s,指令执行的结果应把s送到d。81立即寻址方式(Immediate Address
3、)立即数是指操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里。在指令译码执行时,可以立即得到操作数,它可以是8位或16位或32位的。16/32位的存放规则:高字节存放在高地址,低字节存放在低地址。立即寻址主要用来给寄存器或存储器赋初值。9例1: MOV AX,3064H 执行后AX=? AX=3064H立即寻址示意图:10例2:立即数寻址方式举例:MOVAH, 01101100BMOVDL, BMOVCX, 4*5MOVEAX,34567809H112、寄存器寻址方式(Register Address) 操作数放在通用寄存器中:对于32位操作数,寄存器可以是EAX、E
4、BX、ECX、EDX、ESI、EDI、ESP、EBP等;对于16位操作数,寄存器可以是AX、BX、CX、DX、 SI、DI、SP、BP等;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL、DH等。寄存器寻址方式的特点是运算速度快。12例3:MOVAX,BX执行前(AX) = ?(BX) = 1234H执行后(AX) = 1234H(BX) = 1234H13例4:MOVBL,AH执行前AH = 00101100B执行后BL= 00101100B寄存器寻址示意图: 14 例5:寄存器寻址方式举例:MOV AL, BL;BL寄存器的内容ALMOV DS, AX;AX寄存器的内容
5、DSINCCX;CX寄存器的内容加1DECSI;SI寄存器的内容减1ADD AX, BX;AX、BX寄存器的内容相加,结果AX15操作数所在内存单元的完整地址表达式:163、直接寻址方式直接寻址方式中,有效地址EA直接出现在指令中,存放在代码段中指令操作码之后,操作数存放在数据段中,这种格式中段超越前缀不能省略,否则会出现寻址错误。另一种直接寻址方式的格式是,EA是用变量来代表的存储单元的有效地址。 直接寻址方式的限制是两个操作数中必须有一个是寄存器。17例6: MOV AX, 2000H ; 执行前(DS)=3000H,(AX)=?, 执行后(AX) = 3050H18直接寻址示意图:19例
6、7:直接寻址方式举例:MOV DX, DS:2346H;取出数据段EA为2346H字单元中的内容DXMOV BL, ES:3CH;取出附加段EA为3CH字节单元中的内容BL20例8:取出数据段中以VAR命名的字单元的内容送AX寄存器,该指令为MOV AX, DS:VAR 或MOV AX, VAR4寄存器间接寻址21寄存器间接寻址要求事先把存储器单元的有效地址写入规定的基址或变址寄存器。指令的地址表达式格式为:段寄存器:间址寄存器对于约定的逻辑段段超越前缀可以省略。16位寻址时,EA由BX、SI、DI或BP提供,其中,BX、SI、DI默认使用DS,BP默认使用SS。32位寻址时,EA由EAX、E
7、BX、ECX、EDX、ESI、EDI、ESP、EBP,其中,ESP、EBP默认使用SS,其余默认使用DS。5基址寻址22格式:段寄存器:基址寄存器位移量段寄存器:位移量基址寄存器操作数的有效地址:一个基址寄存器的内容和指令中指定的8位或16位的位移量之和。16位寄存器BP和BX作基址寄存器, 使用BP基址寻址,约定访问SS;使用BX基址寻址,约定访问DS。8个32位寄存器EBP、ESP、EAXEDX、ESI、EDI作基址寄存器,使用EBP和ESP基址寻址时,约定访问SS;使用其余32位寄存器时,约定访问DS。6变址寻址23(1)无比例因子的变址寻址。格式:段寄存器:变址寄存器位移量 或段寄存器
8、:位移量变址寄存器 其中,变址寄存器只能选用DI或SI,约定访问DS。默认情况下:PA=10H(DS) + (SI) + D8PA=10H(DS) + (SI) + D16 PA=10H(DS) + (DI) + D8PA=10H(DS) + (DI) + D1624(2)有比例因子的变址寻址。格式:段寄存器:比例因子变址寄存器位移量 段寄存器:位移量比例因子变址寄存器其中,操作数的有效地址为一个变址寄存器乘以比例因子再与指令中指定的8位或16位的位移量之和。变址寄存器可为EBP或EAXEDX、ESI、EDI这7个32位寄存器。除EBP默认访问SS外,其余变址寄存器默认访问DS。25默认情况下
9、:PA=10H(DS) + (比例因子 ESI) + D8PA=10H(DS)+(比例因子ESI) + D167基址加变址寻址26(1)无比例因子的基址加变址寻址。格式:段寄存器:基址寄存器变址寄存器位移量 或段寄存器:位移量基址寄存器变址寄存器 或段寄存器:位移量基址寄存器变址寄存器其中,基址寄存器和变址寄存器须为规定的16位寄存器。27(2)有比例因子的基址加变址寻址。格式:段寄存器:基址寄存器比例因子*变址寄存器位移量 或段寄存器:位移量基址寄存器比例因子*变址寄存器 或段寄存器:位移量基址寄存器变址寄存器*比例因子其中,基址寄存器和变址寄存器须为规定的32位寄存器。28小结 实模式时,
10、段的最大长度为64K,所以必须保证CPU最终算出的有效地址不超过FFFFH,而且操作数最高字节单元的有效地址也不能超过FFFFH,否则执行寻址时系统将要瘫痪。 有效地址表达式中的位移量是无符号整数。 带有比例因子的变址寻址常用于检索一维数组元素, 比例因子的大小常由数组元素大小决定。 带有比例因子的基址加变址寻址常用于检索二维数组元素。4.1.2 与转移地址有关的寻址方式29这种寻址方式用来确定转移指令及CALL指令的转向地址。1段内直接寻址(intrasegment direct ddressing)30转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和,如图4-1所示
11、。 这种方式的转向有效地址用相对于当前IP值的位移量来表示,所以它是一种相对寻址方式。指令中的位移量是转向的有效地址与当前IP值之差,所以当这一程序段在内存中的不同区域运行时,这种寻址方式的转移指令本身不会发生变化,这是符合程序的再定位要求的。这种寻址方式适用于条件转移及无条件转移指令,但是当它用于条件转移指令时,位移量只允许8位(386及其后继机型条件转移指令的位移量可为8位或32位)。无条件转移指令在位移量为8位时称为短跳转,位移量为16位时则称为近跳转。31指令的汇编语言格式表示为:JMP NEAR PTR PROGIAJMP SHORT QUEST其中,PROGIA和QUEST均为转向
12、的符号地址,在机器指令中,用位移量来表示。在汇编指令中,如果位移量为16位,则在符号地址前加操作符NERA PTR;如果位移量为8位,则在符号地址前加操作符SHORT。2段内间接寻址(intrasegment indirect addressing)32转向有效地址是一个寄存器或是一个存储单元的内容。这个寄存器或存储器单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的转向的有效地址用来取代IP寄存器的内容33段内间接寻址转移指令的汇编格式可以表示为:JMP BXJMP WORD PTRBP+TABLE其中WORD PTR为操作符,用以指出其后的寻址方式所取得的转向地址是
13、一个字的有效地址,也就是说它是一种段内转移。3段间直接寻址(intersegment direct addressing)34在指令中直接提供了转向段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作,如图4-3所示。 35指令的汇编语言格式可表示为:JMP FAR PTR NEXTROUTINT其中,NEXTROUTINT为转向的符号地址,FAR PTR则是表示段间转移的操作符。对于386及其后继机型,段间转移应修改CS和EIP的内容,方法仍然和16位寻址时一致。4段间间接寻址(intersegme
14、nt indirect addressing)36用存储器中的两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。这里,存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得,如图4-4所示。37这种指令的汇编语言格式可表示为:JMP DWORD PTRINTERSBX其中,INTERSBX说明数据寻址方式为直接变址寻址方式,DWORD PTR为双字操作符,说明转向地址需取双字为段间转移指令。对于386及其后继机型,除16位寻址方式外,还可使用32位寻址方式,方法上也与16位寻址相同。如:JMP DWORD PTREDI4.2 80X86微处理器
15、的指令格式38 程序是使计算机完成一个任务的一组命令或指令序列; 指令是规定微处理器执行某种特定操作的“命令”。指令系统是计算机全部的指令的集合, 指令系统的功能大体上决定了计算机系统硬件的基本功能。 机器指令由二进制数组成,计算机硬件只能识别、存储和运行机器指令。但机器指令无论是在书写、阅读和记忆都是非常困难的,为此,引入了符号指令。符号指令使用规定的助记符和规定的书写格式的指令。汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的。3980X86 CPU指令系统采用了变长的指令格式,不可能用一个简单的规则来描述指令的编码格式。通常指令
16、由操作码和操作数两个部分组成。操作码表示该指令完成的操作,如数据传送指令、算术逻辑操作等。操作数可是参加操作的数本身, 或操作数的地址。如何寻找操作数是由指令的寻址方式指出,也是由指令的编码方式指出。4.2.1 80X86微处理器的指令编码格式408086/8088/80286指令编码的一般形式,如图4-5所示。编码中每个方框代表了指令相应的目标码的一个或多个字节,并且各成分是以字节顺序表示的,低地址字节在左边。41以8086/088指令格式编码格式为例,其指令由16个字节组成,它包括操作码、寻址方式以及操作数三部分组成,如图4-6所示42指令的第一字节为操作码,规定指令的操作类型。第二字节规
17、定操作数的寻址方式,称为寻址方式字节,是指令编码中最复杂的字节。在这一字节中放置了关于操作数类型的信息,用于指出指令中寄存器和存储器寻址方式的信息。寻址方式字节被分成三个域,分别是mod(方式)域、reg(寄存器)域和r/m(寄存器/存储器)域。指令中操作码字节和寻址方式字节格式如图4-7所示。434.2.2 Pentium指令格式44Pentium的指令长度变化很大(1字节12字节),格式如下:45例:给出MOV ECX,EBX+ESI4的指令编码。解:首先知道MOV指令的指令码为100010,D=1,W=1。其次MOD/RM部分为 00 001 100。SIB部分为 10 110 011。
18、所以该指令编码为 1000 1011 0000 1100 1011 0011,也就是8B0CB3。4.2.3 80X86微处理器的指令书写格式46计算机是通过执行指令来处理各种数据,同时指出数据的来源、操作结果的去向以及执行的操作。计算机中的指令由操作码字段和操作数字段组成,如图4-8所示。47操作码(OP: Operation Code):描述计算机所要执行的操作,其长度取决于指令系统中指令的条数。操作数(Operand):描述该指令的操作对象(地址码/操作数),如给出参与操作的操作数的值是多少或者指出操作数存放在何处、操作的结果应送往何处等信息。操作数可分为存储器操作数、寄存器操作数和立即
19、数。根据地址码部分所给出的地址个数,指令可以分为零地址指令、一地址指令、二地址指令和三地址指令等。4.3 80X86微处理器的指令系统4880X86 CPU指令系统按功能分为6类,它们是数据传送类指令、算术运算类指令、转移和调用指令、逻辑运算和移位指令、串操作指令和处理机控制指令。4.3.1 数据传送类指令49数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中。传送指令执行后, 源操作数不变。通常,数据传送类指令的执行不影响状态标志。数据传送指令可以进一步分为通用传送指令、堆栈操作指令和I/O指令。本章仅介绍通用传送指令和堆栈操作指令,I/O指令将在第6章中进行介绍。501通用传送指
20、令(1)数据传送指令。格式:MOV DST, SRC执行的操作(DST) (SRC)其中:DST表示目的操作数,SRC表示源操作数。51MOV指令格式: MOV mem/reg1,mem/reg2 MOV reg,data MOV ac,mem MOV mem,ac MOV segreg,mem/reg MOV mem/reg,segreg MOV mem/reg,data52(2)符号扩展传送指令。格式:MOVSX DST, SRC功能:将SRC的符号位向高位扩展,使其与目标操作数字长相同,再送到DST,而SRC保持不变。说明: DST为REG16或REG32,SRC为小于等于DST的立即数
21、或存储器操作数或寄存器操作数。 对于带符号数的补码,扩展前后的真值相等,只有补码的位数不同。53(3)零扩展传送指令。格式:MOVZX DST,SRC功能:将SRC的高位用0补充,使其与目标操作数字长相同,再送到DST,而SRC保持不变。说明: DST为REG16或REG32,SRC为小于等于DST的立即数或存储器操作数或寄存器操作数。 对于无符号数的真值不变。54(4)有效地址送寄存器指令。格式:LEA REG, SRC; (MOV DES,OFFSET SRC)执行:REG EA把源操作数的有效地址送到指定的寄存器。SRC为内存操作数。REG为16位或32位寄存器(除段寄存器外)。55(5
22、)指针传送指令。格式:操作码助记符 REG, SRC功能与说明: 操作码助记符:LDS、LES、LFS、LGS、LSS,其后两位字母表段寄存器, 它们是隐含的目标寄存器,共5条地址指针传送指令。 始终将源操作数高16位送入隐含的目标寄存器。若源操作数是32位内存操作数,则将低16位送目标通用寄存器; 若源操作数是48位内存操作数,则将低32位送目标通用寄存器。56(6)标志寄存器传送指令。 格式:LAHF功能:AH (标志寄存器Flag的低字节),即将标志寄存器的低8位送AH指令,如图4-9所示。 格式:SAHF功能:(PSW的低位字节)(AH),即将AH寄存器的内容传送到标志寄存器低8位,如
23、图4-10所示。57(7)交换指令。格式:XCHG OPR1, OPR2 执行的操作:(OPR1) (OPR2) 其中:OPR1与OPR2须是等长操作数,且OPR1,OPR2必须有一个是寄存器,能够完成寄存器与寄存器之间交换数据以及寄存器与存储器之间交换数据。注意: 交换指令执行结果不影响标志位。 段寄存器不能作为XCHG的操作数。58(8)字节交换指令。格式:BSWAP REG32功能: 将32位REG的位31位24与 位7位0交换,位23位16与位15位8交换,如图4-11所示。59(9)查表指令XLAT(换码指令)。格式:XLAT 表头变量名执行:AL(DS:BX+AL )或AL(DS:
24、EBX+AL)用途:把一种码转换为另一种代码。602堆栈操作指令堆栈是人为定义的一块连续的内存空间,用来暂存数据,按“先进后出”的规律存取;栈底为堆栈空间的高地址单元,栈顶为低地址单元;栈底是固定不变的,栈顶随数据的进栈与出栈在变化,通常用SP来指出栈顶的地址;堆栈操作以“字”为基本单位。数据进栈后,栈顶指针向低地址端调整;数据出栈后,栈顶指针向高地址端调整。数据进栈的规律是,高位字节存入高地址单元,低位字节存入低地址单元。61(1)进栈指令PUSH。格式:PUSH SRC功能: 执行时, 首先调整堆栈指针, 然后把源操作数压栈。执行操作:16位:(SP)(SP)-2 (SP)+1,(SP)(
25、SRC)32位:(ESP)(ESP)-4 (ESP)+3 (ESP)(SRC)注意:内存操作数若不是直接寻址,则必须用PTR运算符来说明其属性,例如PUSH WORD PTR BX。62(2)出栈指令POP。格式:POP DST功能:先将栈顶弹出2个或4个字节,送入目标操作数,然后调整堆栈指针。执行操作:16位: (SP)+1,(SP)(DST) (SP) (SP) + 232位: (ESP)+3(SP)(DST) (ESP) (ESP) +4注意:内存操作数若不是直接寻址, 则必须用PTR运算符来说明其属性, 例如 POP WORD PTRBX63(3)16位标志寄存器进栈/出栈指令。(4)
26、32位标志寄存器进栈/出栈指令。64(5)16位通用寄存器进栈/出栈指令。 PUSHA:16位通用寄存器入栈。格式:PUSHA功能:执行PUSHA时,首先将SPSP 16,再依次将AX、CX、DX、BX、SP、BP、SI、DI入栈。 POPA:16位通用寄存器出栈。格式:POPA功能:将堆栈内的内容依次弹出至DI、SI、BP、SP、BX、DX、CX、AX。注意:进栈与出栈顺序时相反的;65(6)32位通用寄存器进栈/出栈指令。 PUSHAD:32位通用寄存器入栈。格式:PUSHAD功能:执行PUSHA时,首先将SPSP32依次将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI入栈
27、。 POPAD:32位通用寄存器出栈。格式:POPAD功能:将堆栈内的内容依次弹出至EDI、ESI、EBP、ESP、EBX、EDX、ECX、 EAX。4.3.2 算术运算类指令6680X86的算术运算指令包括二进制和十进制运算指令。算术指令用来执行算术运算,它们中有双操作数指令,也有单操作数指令。算术指令的寻址方式遵循以下规则: 双操作数指令的两个操作数中除了源操作数为立即数的情况外,必须有一个操作数在寄存器中。单操作数指令中不允许使用立即数方式。 671加法指令加法指令主要包括ADD加法指令、ADC带进位的加法指令、INC加1指令、XADD 交换加法指令。双操作数的指令ADD和ADC除了源操
28、作数外,不可以有立即数。单操作数指令INC不允许使用立即数。操作数可以是字节或字的运算,并且影响标志位。68(1)ADD加法指令。格式:ADDDST,SRC执行的操作:DST (DST) + (SRC)ADD加法指令影响的标志位有:CF、OF、SF、ZF、PF、AF。ADD指令注意事项: 两个操作数不能同时为存储器操作数; 如果SRC是立即数,DST是存储器操作数,则DST必须用PTR说明是字节还是字型或是双字型,否则汇编时会出错。69(2)ADC带进位的加法指令。格式:ADC DST, SRC执行的操作:DST (DST) + (SRC)+CFADC带进位的加法指令影响的标志位有:CF、OF
29、、SF、ZF、PF、AF,其中CF是上一条指令执行后产生的CF标志。70(3)INC 加1指令。格式:INC OPR执行的操作:(OPR)(OPR) + 1INC指令注意事项: INC指令不影响CF标志,但影响AF、OF、PF、SF、ZF。 INC指令的操作数不能是立即数。 当INC的操作数是存储器操作数时,必须用PTR说明符说明其属性。71(4)XADD 交换加法指令。格式:XADD DST,SRC功能:首先SRC与DST互换,然后SRC+DSTDST注意:DST是寄存器操作数或内存操作数, SRC 只能是与DST等长的寄存器操作数。722减法指令减法指令主要包含:SUB减法指令、SBB带借
30、位减法指令、DEC减1指令、NEG求补指令、CMP比较指令和CMPXCHG 比较并交换指令73(1)SUB减法。格式:SUB DST, SRC执行的操作:DST(DST) (SRC)SUB减法影响的标志位有:CF、OF、SF、ZF、PF、AF。74(2)SBB带借位减法。格式: SBB DST, SRC执行的操作: DST(DST) (SRC) CF75(3)DEC减1。格式:DEC OPR执行的操作(OPR)(OPR) 1DEC指令注意事项: DEC指令不影响CF标志,但影响AF、OF、PF、SF、ZF。 DEC指令的操作数不能是立即数。 当DEC的操作数是存储器操作数时,必须用PTR说明符
31、说明其属性。76(4)NEG求补。格式:NEG OPR执行的操作:OPR - (OPR) 功能:NGE求OPR的负数;若原OPR为正,在执行NEG后,变为补码表示的负数。反之,原OPR为补码表示的负数,则执行完NEG后,变为正数。NEG指令注意事项: 操作数不能是立即数。 NEG指令影响AF、OF、PF、SF、ZF、CF。 对CF的影响: 只有当(OPR) = 0 时,执行完NEG后CF = 0,其他情况CF=1。 对OF的影响: 当(OPR) = -128 或 (OPR) = -32768时OF = 1,其他情况OF = 0。77(5)CMP比较。格式:CMP DST, SRC执行的操作:
32、(DST) (SRC)执行的结果不回送DST,而是根据结果去影响的标志位CF、OF、SF、ZF、PF、AF。CMP常用于转移指令之前。78(6)CMPXCHG 比较并交换指令。格式:CMPXCHG DST,SRC功能:将DST与AL/AX/EAX比较,若相等,则将SRC送DST;若不等,则将DST送AL/AX/EAX。793乘法指令乘法指令主要包含无符号数乘法指令和带符号数乘法指令两种类型。80(1)MUL无符号数乘法指令,如图4-15所示。格式:MUL SRC功能与说明:乘数和被乘数须是等长的无符号二进制数,乘积为双倍长;被乘数默认在累加器中(AL/AX/EAX)。执行的操作: 字节操作:(
33、AX)(AL) * (SRC)字操作: (DX,AX) (AX) * (SRC)双字操作:(EDX,EAX) (EAX) * (SRC)8182注意事项: 目的操作数必须是累加器AL、AX、EAX,源操作数是除立即数之外的寻址方式。 影响CF、OF标志位,其他无定义。 如果乘积的高半部分为0,即AH = 0、DX = 0或EDX=0,则CF=OF = 0,否则CF = OF = 183(2)IMUL带符号数乘法指令。格式1:IMUL SRC执行的操作: 字节操作: (AX) (AL) * (SRC)字操作: (DX,AX) (AX) * (SRC)双字操作: (EDX,EAX) (EAX) *
34、 (SRC)注意事项: 目的操作数必须是累加器AL、AX、EAX。 源操作数是除了立即数之外的寻址方式。 标志位的影响:CF、OF,其他无定义。 如果乘积的高一半是低一半的符号扩展CF=OF = 0,否则 CF = OF = 1。84格式2:IMUL DST,SRC执行的操作:(DST) (DST) * (SRC)注意事项: 标志位的影响:CF、OF, 其他无定义。 如果乘积的高一半是低一半的符号扩展CF=OF = 0,否则 CF = OF = 1。85格式3:IMULDST,SRC,DATA执行的操作: DST DATA * (SRC)注意事项:标志位的影响:CF、OF,其他无定义。如果乘积
35、的高一半是低一半的符号扩展CF=OF = 0,否则CF = OF = 1。864除法运算除法指令主要包括DIV 无符号数的除法指令和IDIV有符号数的除法指令两种类型。另外,在有符号数除法指令中,还需要符号扩展指令的配合。87(1)DIV 无符号数的除法指令。格式:DIV SRC说明:被除数应是除数的双倍字长,被除数放在默认寄存器中。执行的操作如下所述。88字节操作:16位被除数放在AX中,8位除数为源操作数。结果的8位商在AL中,8位的余数在AH中。表示为: (AL) (AX)/(SRC)的商(AH) (AX)/(SRC)的余数字操作:32 位被除数在DX,AX中,16位除数为源操作数。结果
36、的16位商在AX中,16位的余数在DX中。表示为:(AX) (DX,AX)/(SRC)的商(DX) (DX,AX)/(SRC)的余数89双字操作:64位被除数在EDX,EAX中,32位除数为源操作数。结果的32位商在EAX中,32位的余数在EDX中。表示为: (EAX) (EDX,EAX)/(SRC)的商 (EDX) (EDX,EAX)/(SRC)的余数注意:执行DIV,运算后对标志位无确定影响,都没有意义。 商超过规定的范围, 去执行0型中断。90(2)IDIV有符号数的除法指令。格式:IDIV SRC说明: 与DIV相同,但除数、被除数和商值都是有符号补码数。 若被除数与除数等长时, 须先
37、将被除数扩展。 数的大小不变, 仅将数的符号位扩展。执行的操作如下所述。91字节操作:16位被除数在AX中,8位除数为源操作数。结果的8位商在AL中,8位的余数在AH中。表示为:(AL) (AX)/(SRC)的商(AH) (AX)/(SRC)的余数字操作:32位被除数在DX、AX中,16位除数为源操作数。结果的16位商在AX中,16位的余数在DX中。表示为:(AX) (DX,AX)/(SRC)的商 (DX) (DX,AX)/(SRC)的余数92双字操作:64位被除数在EDX、EAX中,32位除数为源操作数。结果的32位商在EAX中,32位的余数在EDX中。表示为: (EAX) (EDX,EAX
38、)/(SRC)的商(EDX) (EDX,EAX)/(SRC)的余数93(3)符号扩展指令。 CBW字节转换为字。格式:CBW执行的操作:将AL的符号位扩展到AH。 CWD字转换为双字。格式: CWD执行的操作:将AX的符号位扩展到DX。94 CDQ双字扩展为四字。格式:CDQ执行的操作: EAX的符号位扩展到EDX。955十进制调整指令二十进制码(BCD码)是二进制数编码的十进制数。BCD码可分为压缩BCD(组合BCD码)和非压缩BCD码(未组合BCD码/分离BCD码)两种。压缩BCD码用4位二进制数表示一位十进制数。非压缩BCD码用8位二进制数表示一位十进制数。96 前面介绍的四则运算指令,
39、其运算对象都是二进制数,CPU在执行中按“逢二进一,借一当二”的规则处理运算过程中的进位和借位。如果运算对象是BCD码,就需要设置一套“调整指令”。调整指令并非用来进行运算,其目的是:在进行十进制的四则运算中,先用上述的二进制数运算指令,然后再用相关的调整指令,对结果进行修正,修正后的结果就是用BCD码表示的十进制数。4.3.3 转移和调用指令97用于控制指令流程的指令有转移、循环、过程调用和中断调用等指令。按转移条件分为:无条件转移和有条件转移;按转移的范围分为:段内转移和段间转移;按获取地址的方法分为:直接转移和间接转移。981无条件转移指令JMP无条件转移指令功能:无条件转移,执行指定标
40、号处的指令。无条件转移指令的执行结果不影响标志位。格式1:段内直接转移JMP 标号JMP SHORT 标号说明:段内转移(SHORT)指令偏移量为8位,允许转移值的范围为-128+127。不含SHORT的指令,其转移范围可覆盖整个逻辑段。99格式2: 段内间接转移JMP 寄存器操作数; (IP)(EA)JMP 内存操作数说明:寄存器、内存单元存放的是有效地址。所谓“间接”,是指当CPU执行指令时,将寄存器或内存单元内的有效地址写入IP或EIP,从而实现转移。100格式3: 段间直接转移JMP 标号 ;(IP)跳转的EA ;(CS) 跳转的段地址说明:模块化程序设计中,从一个模块转移到另一个模块
41、需执行段间转移指令,此时段间转移标号要作两项说明:在转移目标模块(即被调用模块)中用PUBLIC说明为“公共变量”,在本模块(即调用模块)中用EXTRN说明为“外部变量名”。在模块设计时,从一个模块转移到另一个模块,用段间直接转移。101格式4:段间间接转移JMP 内存操作数;(IP) (EA);(CS)(EA+2)在实模式下,段间间接转移指令将段地址和偏移地址送给CS和IP。1022条件转移指令格式: 操作码助记符 转移地址标号功能:根据上一条指令对标志寄存器中标志位的影响来决定程序执行的流程,若满足条件时执行指定标号处的指令,否则,顺序执行后续指令。 (1)按标志位的当前状态转移。(2)无
42、符号数条件转移。(3)有符号数条件转移。(4)循环控制转移。1033子程序调用与返回子程序是一个完整的、独立的有一定名称(标号)的程序段,它可以多次被其他程序调用,并在这个程序段执行完后返回到原先调用的程序处。主程序调用子程序用子程序调用指令CALL实现;子程序结束须用一条返回指令(eg.RET指令),返回到主程序。CPU在读取CALL指令时, IP自动递增,使它指向下一条指令的存储单元地址。CALL指令执行时,必须保存CALL指令后面的第一条指令地址(断点地址)。104(1)子程序调用指令。 段内直接相对调用。格式:CALL DST 段内间接调用。格式: CALL MEM/REG 段间直接调
43、用。格式:CALLFAR PTR 过程名 段间间接调用。格式: CALL MEM 无参数的返回。格式: RET 有参数返回指令。格式:RET N(N为偶数)1054中断调用及返回(1)中断调用指令(软件中断指令)。格式:INT n(2)中断返回指令。格式: IRET功能:该指令为中断服务程序的返回指令,CPU执行该指令时,依次从栈顶弹出6个元素送IP、CS、FLAGS,返回调用程序断点。4.3.4 逻辑运算和移位指令1061逻辑运算指令(1)取反指令。NOT 目标操作数NOT MEM/REG功能:按位求反,不影响标志位。(2)与指令。AND 目标,源操作数功能:源、目操作数按位相“与”,结果放
44、目标操作数。107(3)或指令OR 目标,源操作数功能:源、目操作数按位相“或”,结果放目标操作数(4)异或指令XOR 目标,源操作数功能: 源、目操作数按位“异或”,结果放目标操作数。按位异或相同为“0”,相异为“1”。注意: 源、目标操作数不允许同为内存操作数。 当源操作数为立即数,目标操作数为内存操作数时,须用PTR说明其属性。1082移位指令(1)开环移位指令(见图4-17)109算术移位n位相当于把二进制数乘以或除以2n;逻辑移位操作则用于截取字节或字中的若干位。移位指令的执行结果影响PF、SF、ZF和CF。其中,CF总是等于最后移出的那一位的值,AF不定。 算术左移:SAL 操作数
45、,CL/立即数。 逻辑左移:SHL 操作数,CL/立即数。 算术右移:SAR 操作数,CL/立即数。 逻辑右移:SHR 操作数,CL/立即数。110(2)闭环移位指令。含进位的循环左移:RCL操作数,CL立即数。含进位的循环右移:RCR操作数,CL立即数。不含进位的循环左移:ROL操作数,CL立即数。1113测试与位测试指令 (1)测试指令。格式:TEST 目,源功能:源、目操作数相“与”,但结果不回送目标操作数,结果影响标志位P、Z、S,A未定义,O、C置0。该指令后跟转移指令,用来测试目标操作数的一位或某几位。112(2)位测试指令。格式:位测试:BT 目标操作数,源操作数位测试置0:BT
46、R目标操作数,源操作数位测试置1:BTS 目标操作数,源操作数位测试取反:BTC 目标操作数,源操作数113功能与说明: 四条指令相同点: 测试目标操作数中由源操作数指定的那一位,并将测试位位值送C标志。若测试的位置大于目标操作数的长度,则取源/目的余数才是测试位。指令执行完后,源操作数不变。 不同点:BT执行后,目标操作数不变;BTR、BTS、BTC执行后对测试位做相应的操作:置0,置1,取反。1144位扫描指令(1)向前扫描指令。格式:BSF目标寄存器,源操作数功能:从源的低位高位搜索,将遇到第一个“1”所在的序号存入目标寄存器中。(2)向后扫描指令。格式:BSR目标寄存器,源操作数功能:
47、从源的高位低位搜索,将遇到第一个“1”所在的序号存入目标寄存器中。说明: 源操作数为0,Z标=1,否则,Z标=0。 源、目标操作数须等长;执行完指令源不变。4.3.5 串操作指令115从80386开始,串操作指令有所扩展,在原先的字节操作、字操作基础上,增加了双字操作,而且可以采用16位和32位寻址。各种串操作指令虽然功能有所不同,但有许多共同之处。例如,当对串中的一个“元素”操作之后,都要自动修改串地址指针,使其指向下一个元素。这个“元素”可以是一个字节、字、双字等类型。对数据块(字符串)进行操作,其中部分指令两个操作数可以同时是存储器操作数。源串和目标串的存储及寻址方式都是隐含规定的,即源
48、串放在数据段,目标串放在ES附加段。在16位寻址操作下,CPU自动用SI间址访问数据段,用DI间址访问ES附加段,用CX作为串计算器。在32位寻址操作下,CPU自动用ESI间址访问数据段,用EDI间址访问ES附加段,用ECX作为串计算器。116串操作指令注意事项:(1)串操作指令需指明每次操作的类型:字节,字,双字。(2)串操作指令使用DS:SI(ESI)作为源操作数指针,可用段前缀指令改变;使用ES:DI(EDI)作为目的操作数指针,不能用段前缀指令改变。(3)设置DF来表示每次操作以后变址寄存器SI和DI的变化方向:DF0为增址方式,DF1为减址方式。 用CX存放要处理的字符串的元素个数。
49、 每处理完一个元素,自动修改SI、DI的值。1171串传送指令格式: (1)MOVSB ;字节传送。 (2)MOVSW ;字传送。 (3)MOVSD ;双字传送。 (4)MOVS OPRD1,OPRD2。功能:CPU执行串传送指令,都是将源串DS:SI的一个字符元素送目标串ES:DI。118有重复前缀的格式:(5)REPMOVSB。(6)REPMOVSW。(7)REPMOVSD。功能:除完成基本传送指令操作外,需要将传送元素个数先送CX,每传送一个元素都要自动完成(CX1CX)操作,如果(CX0),传送后续元素,直到(CX10)为止。1192串装入指令(Load from string)格式:
50、LODSB;DS:SI中的一个字节送ALLODSW;DS:SI中的一个字送AXLODSD ;DS:SI中的一个双字送EAX功能:从源串取一个字符串元素送累加器;注意:根据D标志自动修改SI。1203串存储指令(Store Into String)格式:STOSB;把 ALES: DI的1个单元 STOSW ;把 AX ES: DI的2个单元 STOSD;把 EAX ES: DI的4个单元 注意:根据D标志自动修改DI。121有重复前缀的格式: REPSTOSBREPSTOSWREPSTOSD说明: 指令执行前,应把欲存储元素个数送CX; CPU执行指令时,除完成基本存储指令的操作外,每存储一个元素,自动完成CX-1CX,若CX-10,存储下一个元素,直到(CX -1=0)为止。1224串比较指令基本格式:CMPSOPRD1,OPRD2;OPRD1是源串,OPRD2是目的串CMPSB;字节串比较CMP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 续聘合同申请书
- 2025年教学楼照明系统承包合同规范范本
- 2025年国际物流解决方案购买合同范本
- 2025年中国激光切割机行业市场调研及投资战略规划报告
- 中国家禽养殖设备市场运行态势及行业发展前景预测报告
- 2025年度教师继续教育项目合同模板
- 天然气申请书
- 2025年度环保节能产品定制采购合同
- 2025年度新材料研发与应用合作协议书
- 2025年度农业项目经营权转让合同范本
- 机票预订行业营销策略方案
- 谢尔塔拉露天煤矿变更环评
- 行政伦理学教程(第四版)课件 第2章 行政伦理学的思想资源
- 眼的解剖结构与生理功能课件
- 2024年银行考试-兴业银行笔试参考题库含答案
- Q/GDW-1738-2012配电网规划设计技术导则
- 【药用低密度聚乙烯袋探究4500字(论文)】
- 乡镇林长制培训课件
- 企业法律顾问方案
- 哈佛大学住房研究联合中心:2024年美国房屋租赁报告
- 农商银行贵金属分析报告
评论
0/150
提交评论