




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章32位微处理器指令系统3.132位指令运行环境1.16位段32位X86CPU还可以使用32位寄存器和32位寻址方式,处理32位数据及执行32位的新增指令,但是,段基地址和偏移量都只用16位,6个段寄存器仍然当作16位的段寄存器使用,对于偏移地址来说,如果是32位,则高16位应该为0,只有低16位偏移地址有效,相当于可以进行32位数处理的快速8086,所以称之为“16位段”。2.32位段32位X86CPU由实地址模式可以进入保护工作模式,它是一个增强了80286保护模式功能的32位保护工作模式。在保护工作模式下,32位微处理器不仅具有段式存储器管理功能,而且还有页式存储器管理功能,支持虚拟存储器,段基地址和段内偏移量都是32位,称之为“32位段”。3.2寻址方式
3.2.1寻址方式概述一条指令包含操作码和操作数两部分,操作码(指令助记符)指出该指令要进行的操作,操作数指出该指令需要的操作数或操作数的地址。操作数在计算机中的位置及存取方式见表3-1。数据存放的位置存取方式寄存器CPU可直接存取外设(接口)用IN、OUT指令输入/输出内存在内存的数据段、附加数据段或堆栈段,可利用存储器寻址的各种寻址方式存取在内存的代码段(立即寻址)表3-1操作数在计算机中的位置及存取方式
指令根据一定的方式,先找到存储操作数的空间地址,然后取出操作数进行处理。寻找操作数的方式称为寻址方式。寻址方式:操作数地址由段基址和段内偏移地址共同产生。段基址由段基址寄存器提供,有CS、SS、DS、ES、FS和GS。段内偏移地址也称为有效地址EA(effectiveaddress),32位有效地址的公式是:EA=基址+(变址*比例因子)+位移量32位寻址方式:段寄存器、基址寄存器、变址寄存器、比例因子和位移量的关系见表3-2段寄存器基址寄存器变址寄存器比例因子位移量DSEAXEBXECXEDXESIEDIEAXEBXECXEDXESIEDIEBP12488位32位(带符号数)SSESPEBP表3-232位寻址方式时段寄存器、基址寄存器、变址寄存器、比例因子和位移量的关系说明:1.在表3-2中,如果以EBP和ESP为基址寄存器,默认访问的是堆栈段,段寄存器是SS。若以其他6个寄存器为基址寄存器,默认访问的是数据段,段寄存器是DS。2.如果数据存放在内存的附加数据段时,需使用段超越前缀“ES:”、“FS:”或“GS:”,才能访问到相应附加数据段中的数据。3.在串操作时,源串默认的段寄存器是DS,目的串默认的段寄存器是ES。4.数据存放在内存的堆栈段时,默认的段寄存器为SS。5.比例因子只能是1、2、4、8。
6.位移量是8位或32位的带符号数,所谓带符号数是指补码表示的二进制数。7.立即寻址时,段寄存器为CS,以IP(16位)或EIP(32位)为段内偏移地址,找到指令的同时也就找到了数据。8.16位寻址方式时段寄存器、基址寄存器、变址寄存器和位移量的关系见表3-3。
段寄存器基址寄存器变址寄存器位移量DSBXSIDI8位16位(带符号数)SSBPSIDICSIP表3-316位寻址方式时段寄存器、基址寄存器、变址寄存器和位移量的关系在介绍各种寻址方式之前,先说明指令格式中出现的助记符号:OPS:源操作数,代表8、16和32位OPSn:n(=8或16或32)位源操作数OPD:目的操作数,代表8、16和32位OPDn:n(=8或16或32)位目的操作数seg:段寄存器reg:寄存器,代表8、16和32位regn:n(=8或16或32)位寄存器mem:存储器操作数,代表8、16和32位memn:n(=8或16或32或48)位存储器操作数。48位存储器操作数,仅在地址传送指令中使用。imm:立即数,代表8、16和32位immn:n(=8或16或32)位立即数(reg):表示寄存器中寄存的数。3.2.2立即寻址:
操作数位置:内存代码段。立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。
立即数可以是8位无符号整数或16位无符号整数,但不可以是小数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。
立即寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值。例【3-1】指令MOVAX,#0002H,是将立即数0002H送到AX中。MOVEAX,#11223344H指令是将立即数11223344H传送给EAX。
3.2.3寄存器寻址
说明:寄存器中寄存的内容就是操作数。操作数位置:CPU中的某个寄存器。例【3-3】ADDEAX,EBX这是一条双操作数指令,其中ADD为加法指令操作符,它的两个加数分别由EAX和EBX提供。假定执行前(EAX)=12345678H,(EBX)=00000034H,则执行后(EAX)=123456ACH,EBX寄存器值不变。例【3-2】INCAX其中,INC为+1指令操作符,其操作数地址为寄存器AX在机器指令中的编码,不同的寄存器使用不同的编码加以编排。本条指令的操作数就在AX中。假定执行前(AX)=1234H,则执行后(AX)=1235H。3.2.4存储器寻址方式:操作数位置:通常在内存的数据段DS和堆栈段SS中。程序运行所使用的数据大都保存在主存储器中,用指令存取存储器操作数的方式较多,即存储器寻址的方式较多。1.直接寻址:在直接寻址方式中,操作数的16或32位偏移地址EA紧跟在指令操作码后面,即操作数的偏移地址EA与操作码一起存放在代码段中,而操作数可以存放在数据段,也可以存放在其他段。例【3-5】假定在数据段DS有双字变量定义为:VARDD12345678H其中VAR是变量名,在经过汇编与连接生成可执行的程序在执行时,它有实际物理地址,由段寄存器DS与偏移地址EA组成。在执行指令MOVEAX,VAR时,其功能是根据变量名VAR的DS和EA,从数据段内偏移地址为EA的内存单元,连续读取4个字节数送给EAX,即(EAX)=12345678H。直接寻址:2.基址寻址以8个基址寄存器中任一个寄存器中的值作为操作数的偏移地址,其中,以EAX、EBX、ECX、EDX、ESI、EDI作为基址寄存器时,默认访问段是数据段DS,以EBP和ESP作为基址寄存器时,默认访问的段是堆栈段SS。例【3-6】MOVAX,[EBX];访问DS段MOVAX,[EBP];访问SS段3.基址加位移寻址以8个32位通用寄存器中任意一个寄存器作为基地址寄存器,再加上8位或32位的位移量,(位移量可以是正,也可以是负),修改基地址寄存器的值使之成为新的所要寻找操作数的偏移地址。默认的段与基址寻址相同。例【3-7】MOVAX,[EBX-08H];访问DS段MOVAX,[EBP+34H];访问SS段4.比例变址寻址:选取除ESP之外的7个32位通用寄存器中任意一个寄存器作为变址寄存器,将变址寄存器的值乘以一个比例常数(1、2、4、8),最后形成操作数的偏移地址。例【3-8】:
MOVAX,[EBX*2];访问DS段MOVECX,[EBP*8];访问DS段5.比例变址加位移寻址:选取除ESP之外的7个32位通用寄存器中任意一个寄存器作为变址寄存器,将变址寄存器的值乘以一个比例常数(1、2、4、8),将换算结果再加上带符号的8位或32位的位移量,最后形成操作数的偏移地址。例【3-9】MOVAX,[EBX*2-30H];访问DS段MOVAX,[EBP*8+4567H];访问DS段6.基址加比例变址寻址以8个32位通用寄存器中任意一个寄存器作为基地址寄存器,再加上除ESP之外的7个32位通用寄存器中任意一个寄存器作为变址寄存器,将变址寄存器的值乘以一个比例常数(1、2、4、8),其换算结果作为操作数的偏移地址;由基址寄存器确定使用DS段还是SS段,其规定相同于基址寻址。例【3-10】MOVAL,[EDX+EBP*2];EDX是基址寄存器,访问DS段MOVEAX,[EBP+ECX*8];EBP是基址寄存器,访问SS段MOVEAX,[EBX][EDI];EBX是基址寄存器,访问DS段MOVEAX,[ESP][EBP];ESP是基址寄存器,访问SS段7.基址加比例变址加位移寻址这种寻址方式是在基址加比例变址寻址基础上,再加上8或32位位移量,构成32位的偏移地址。实际上它是公式3-1即EA=基址+(变址*比例因子)+位移量的综合应用。例【3-11】MOVBL,[ESI+EBP*2+60H];访问DS段MOVEAX,[EBP+EDI*8+3344H];访问SS段MOVEAX,[EBP][EDX];EBP是基址寄存器,访问SS段基址+(变址*比例因子)+位移量8.16位的存储器寻址方式
32位CPU兼容16位CPU的寻址方式,也兼容16位的指令系统,在编写32位程序时,不可避免地要使用16位指令系统编程,在16位CPU的寻址方式中,存储器寻址仍然是主要的,这是因为16位的立即寻址、寄存器寻址与32位的相同,容易理解,下面简单介绍16位的存储器寻址方式。(1)直接寻址指令中直接给出了16位偏移地址,物理地址=段寄存器值*16+偏移地址。例【3-15】MOVBL,[2060H];访问DS段MOVAX,[3344H];访问DS段(2)基址寻址指令中以基址寄存器BX或BP中值为16位的偏移地址访问内存,物理地址=段寄存器值*16+偏移地址。以BX和BP为基址寄存器分别访问数据段和堆栈段。例【3-16】MOVAL,[BX];访问DS段MOVDX,[BP];访问SS段
关于基址寻址,还有另外一种形式,称为相对基址寻址,它是在基址寄存器的基础上,加上一个带符号的8位或16位的位移量。例【3-17】MOVAL,[BX+30H];访问DS段MOVDX,[BP-1110H];访问SS段(3)变址寻址指令中以源变址寄存器SI或目的变址寄存器DI中值为16位的偏移地址访问内存,物理地址=段寄存器值*16+偏移地址。所访问的数据段都是DS数据段。例【3-18】MOVAL,[SI];访问DS段MOVDX,[DI];访问DS段关于变址寻址,还有另外一种形式,称为相对变址寻址,它是在变址寄存器的基础上,加上一个带符号的8位或16位的位移量。例【3-19】MOVAL,[SI-40H];访问DS段MOVDX,[DI+1000H];访问DS段(4)基址(加)变址寻址指令中以基址寄存器的值加上变址寄存器的值所换算的结果作为偏移地址访问内存,基址寄存器与变址寄存器的组合以及默认访问的段,见表3-3。例【3-20】MOVAL,[BX+SI];访问DS段,可以写成MOVAL,[BX][SI]形式MOVDX,[BP+DI];访问SS段,可以写成MOVDX,[BP][DI]形式(5)相对基址(加)变址寻址:相对基址(加)变址寻址是在基址(加)变址寻址的基础之上,加上一个带符号的8位或16位的位移量,最后形成一个16位的偏移地址,所访问的段、基址寄存器与变址寄存器的组合与上述的相同。例【3-21】MOVAL,[BX+SI+10H];访问DS段,可以写成MOVAL,[BX][SI+10H]形式MOVDX,[BP+DI-29H];访问SS段,可以写成MOVDX,[BP][DI-29H]形式3.332位微处理器指令系统概述32位微处理器的指令系统可以分为以下七类:①数据传送指令②算术运算指令③位操作指令④字符串操作指令⑤控制转移指令⑥符号扩展指令⑦处理机控制指令1.32位微处理器指令系统的四种格式:(1)无操作数指令:格式为[标号:]操作符[;注释]如NOP(空操作指令)。在所有指令中,标号和注释是可选项。(2)单操作数指令格式为[标号:]操作符OPD(地址)[;注释]它的操作规定为:①操作对象为目的地址中的操作数,操作结束后,其运算结果送入目的地址中。②操作数不能是立即数。③操作数类型必须明确。如INCBYTEPTR[2233H],用数据类型说明符PTR对内存数据定义为字节(BYTE)。如INCAX,由于AX为16位寄存器,数据类型确定为字类型。(3)双操作数指令格式为[标号:]操作符OPD,OPS[;注释]它的操作规定为:①OPD和OPS应具有相同的类型,即必须同时是8、16或32位。②目的操作数OPD不能是立即数。③操作结束后,其操作结果送入目的操作数中,而源操作数并不改变。(只有CMP、TEST等极少数指令不影响目的操作数)。④源操作数和目的操作数不能同时为存储器操作数。假如一个操作数在存储器中,则另一个操作数要么是寄存器操作数,要么是立即数,但是立即数不能作为目的操作数。下列两条指令是错误的。ADD[EAX],[EBX]MOV20H,AL。(4)三操作数指令格式为:[标号:]操作符OPD,OPS,立即数[;注释]如SHRDAX,BX,imm8/CL。将BX寄存器中的imm8/CL位右移进入AX中。2.16位和32位指令的区别:16位编程时立即数、寄存器操作数及存储器操作数只能使用8位和16位。32位编程时立即数、寄存器操作数和存储器操作数可以是8、16、32位。16位编程时EA是16位,32位编程时EA是16或32位。16位编程时段寄存器只能使用CS、SS、DS和ES,32位编程时段寄存器可以是CS、SS、DS、ES、FS和GS。3.4数据传送指令3.4.1一般数据传送指令
1.传送指令指令格式:MOVOPD,OPS功能:将源操作数传送到目的地址中,即(OPS)→OPD。MOV有如下五种具体格式:MOVreg,reg ;两个寄存器之间的数据;传送,如MOVAL,BHMOVreg,mem ;内存单元内容送给寄存;器,读内存,如MOVBX,[ESI]MOVmem,reg ;寄存器的数据送给内存单;元,写内存,如MOV[ESI],BXMOVreg,imm ;立即数送给寄存器,;如MOVECX,12345678HMOVmem,imm ;立即数送给内存单元,如;MOVWORDPTR[SI],5678H用于段寄存器的传送指令有三种格式:MOVseg,reg;寄存器数据送给数据段寄存器,如MOVDS,AXMOVreg,seg;段寄存器数据送给寄存器,如MOVAX,DSMOVmem,seg;段寄存器数据送给内存单元,如MOV[ESI],DS
2.数据交换指令:指令格式:XCHGOPD,OPS功能:将源操作数和目的操作数的内容互换,即(OPS)←→(OPD)。XCHG一般有如下三种:XCHGreg,regXCHGreg,memXCHGmem,reg例【3-22】XCHGAH,AL;其操作是AH和AL两;个寄存器的值交换XCHGEAX,EBX;其操作是EAX和EBX;两个寄存器值交换。3.查表转换指令:指令格式:XLAT或XLATB功能:DS:[BX+AL]→AL,或DS:[EBX+AL]→AL,即将(BX)或(EBX)为首地址、(AL)为偏移量的字节存储单元中的内容送AL。由于AL的值不能超过256,所以表的大小也不能超过256个字节。操作码XLAT的含义是:translate(转换)例【3-23】datasegment;定义数据段DStabdb’0123456789’;单引号内汇编后,生成数;0~9对应的ASCII码dataends;数据段结束┇movbx,offsettab;变量名tab的偏移地址传;送给bx,指向表的首地址moval,4;表tab中第5项的偏移量4→alxlat;(tab+4)=34h→al┇该例完成的功能是将al中的一位10进制数转换成对应的ASCII码(字符)。4.标志寄存器装入指令\标志寄存器保存指令
指令格式:LAHF功能:将标志寄存器低8位送AH。指令格式:SAHF功能:将AH的内容送入标志寄存器的低8位,而高8位保持不变。该指令执行后,OF、DF、IF、TF的值均不变,因为这4个标志位于标志寄存器的高8位。但SF、ZF、AF、PF、CF的值会发生变化,因为这5个标志位于标志寄存器的低8位。OF1115141312DF10IF9TF8SF7ZF65AF43PF21CF03.4.2堆栈操作指令堆栈是在内存RAM中开辟的一段空间,利用“先进后出”或“后进先出”原则存取数据’。如果把数据压入堆栈,则堆栈指针的值是减少的,即所谓的向下生成堆栈。由SS:SP(16位)或SS:ESP(32位)指向栈底(栈空)或栈顶(栈不空)地址。利用数据入栈指令PUSH和数据出栈指令POP操作堆栈。1.数据入栈指令:指令格式:PUSHOPS功能:将OPS中的数据压入堆栈中。若压入堆栈中的OPS是16位,则SP(16位CPU)或ESP(32位CPU)减2;若OPS是32位,ESP(32位CPU)减4。PUSH一般有如下三种:PUSHreg16/32 ;寄存器reg必须是16或32位PUSHsegPUSHmem16/32;内存中的数据必须是16或32位PUSHimm16/32;将16位或32位立即数压入堆栈例【3-24】PUSHAX假定执行前,AX=1234H,ESP=00001000H,ESP是堆栈指针。执行时,把AX的高8位(12H)压入堆栈段中ESP-1的存储单元中,AX的低8位(34H)压入堆栈段中ESP-2的存储单元中,对于堆栈中数据的操作,按照“高字节存放高地址、低字节存放低地址”的规则存取。AX的值被压入堆栈后,ESP-2→ESP,堆栈指针ESP中的数值变成00000FFEH,AX内容不变。2.数据出栈指令:指令格式:POPOPD功能:将栈顶元素弹出送到某一寄存器、段寄存器(CS除外)或内存中。注意OPS一定是16或32位。弹出栈的数据若是16位,SP或ESP加2;若数据是32位,ESP加4。POP一般有如下三种:POPreg16/32;寄存器reg必须是16或32位POPseg;seg不能为CS、SSPOPmem 16/32;存储器长度必须是16或32位例【3-25】POPBX,假定在上例的基础上执行POPBX。假定执行前,BX=4567H,ESP=00000FFEH。执行后,BX=1234H,ESP+2=1000H。例【3-26】利用PUSH和POP指令把寄存器EAX和EBX的值交换。PUSHEAXPUSHEBXPOPEAXPOPEBX由PUSH/POP指令还有下面6组:(1)存储器操作数入栈和出栈PUSHWmem;16位存储器操作数入栈PUSHDmem;32位存储器操作数入栈或PUSHWORDPTRmemPUSHDWORDPTRmemPOPWORDPTRmemPOPDWORDPTRmem(2)多个16位通用寄存器入栈和出栈16位数据入栈/出栈配对使用指令:PUSHA/POPA。
PUSHA将AX、BX、CX、DX、SP、BP、SI、DI这8个16位通用寄存器的值依次压入堆栈,其中SP的值是在此条指令未执行之前的值,该指令执行后,SP-16→SP。POPA依次弹出堆栈中的16位字到DI、SI、BP、SP、DX、CX、BX、AX中,该指令执行后,SP+16→SP。(3)多个32位通用寄存器入栈与出栈PUSHAD将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI这8个32位通用寄存器的值依次压入堆栈,其中ESP的值是在此条指令未执行之前的值,指令执行后,ESP-32→ESP。POPAD依次弹出堆栈中的32位字到EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX中,弹出完成后,ESP+32→ESP。上述两组指令用于过程设计时,PUSHA和PUSHAD在过程开始保存通用寄存器的值,POPA和POPAD在过程结束时恢复通用寄存器的值,必须配对使用。(4)16位标志寄存器入栈和出栈PUSHF;将16位标志寄存器F的值入栈POPF;将栈顶内容从堆栈弹出送给16位的标志寄存器F,或弹出送到32位标志寄存器的低16位中,只从栈顶弹出2个字节。操作码POPF的含义是:popflagsoffstack。例【3-27】如果要将0FFFH→FLAGS,可以用以下指令实现:MOVAX,0FFFH;将常量0FFFH→AXPUSHAX;AX入栈POPF;将SS:[SP]中的0FFFH→标;志寄存器F(5)32位标志寄存器入栈和出栈PUSHFD;是将32位标志寄存器EFLAGS的值;入栈POPFD;从堆栈栈顶处连续弹出4字节送给32位的标志寄存器EFLAGS
当从堆栈中弹出32位标志寄存器时,只有在当前特权级为0时,才能从堆栈中弹出32位标志并送给EFLAGS,使得EFLAGS中的I/O特权级标志位IOPL才能被替换。(6)ENTER和LEAVE指令
ENTER/LEAVE指令把EBP寄存器内容入栈/出栈,并在堆栈中为局部变量分配/释放存储空间,通常在子程序调用时使用该组指令。3.4.3地址传送指令:1.传送偏移地址指令
指令格式:LEAOPD,OPS功能:LEA(LoadEffectiveAddress)指令按OPS提供的寻址方式计算偏移地址,并将其送入OPD中。例【3-28】datasegment;数据内存分配见图3-1bufdb’ABCDEF’;数据段内定义的数是41H、42H、43H、;44H、45H、46Hnumdw1234H,-5;NUMDW1234H
;变量NUM定义为字类型数据区的首地址,存放有数据1234H
dataends┇movsi,offsetnum;将num的ea即6传送给sileasi,num;与上一条指令等价movdx,[si];DS:[si]=1234h→dx,数据传送2.传送偏移地址到寄存器并传送段值到数据段DS的指令指令格式:LDSOPD,OPS功能:(OPS)→OPD,(OPS+2)→DS(OPS)→OPD,(OPS+4)→DS(仅32位CPU)。例【3-29】设ABC变量名定义的数据如下。.DATA;定义数据段XYZDD12345678H;XYZ是变量名,DD是定义双字的伪指令ABCDF001012345678H;ABC是变量名,DF是定义三个字的伪指令执行指令LDSSI,XYZ后,DS=1234H,SI=5678H。执行指令LDSESI,ABC后,DS=0010H,ESI=12345678H。3.传送偏移地址到寄存器并传送段值到数据段ES、FS、GS的指令
指令格式:LESOPD,OPSLFSOPD,OPSLGSOPD,OPS3.4.4输入输出指令
输入指令实现外部设备向主机输入信息,输出指令实现主机向外部设备输出信息。将外部设备中的数据送至寄存器AL、AX或EAX的过程为输入过程,将AL、AX或EAX中的数据送至外部设备的过程为输出过程。外设和主机数据交换见图3-4。外部设备主机输入IN输出OUT图3-4外设和主机数据交换3.5算术运算指令算术运算指令分为二进制算术运算指令和BCD码算术运算调整指令3.5.1加法指令
1.ADD指令
指令格式:ADDOPD,OPS功能:(OPD)+(OPS)→OPD影响的标志位是:AF、OF、PF、SF、ZF、CFADD指令有下面5种具体格式:ADDreg,reg;例ADDAX,BX和ADDEAX,EBXADDreg,mem;例ADDAX,[ESI]和ADDEAX,[ESI]ADDmem,reg;例ADD[ESI],BX和ADD[ESI],EBXADDreg,imm;例ADDAX,2和ADDEAX,22334455HADDmem,imm;例ADDBYTEPTR[DI],3和ADDWORD;PTR[ESI],1104H例【3-31】利用加法指令实现1位数值数据0~9和其对应的1位字符数据'0'~'9'的转换。
假定AL中存放了1位数值数据(0~9),指令ADDAL,30H可实现此转换。MOVAL,1ADDAL,30H;CF=0,SF=0,OF=0,ZF=0,PF=0查ASCII表可知字符数据‘0’~‘9’的ASCII为30H~39H,1位数值数据和它对应的字符数据之间的差为30H。(0的asc码是48)
2.ADC指令(带进位加法指令)
指令格式:ADCOPD,OPS功能:(OPD)+(OPS)+CF→OPD影响的标志位是:AF、OF、PF、SF、ZF、CFADC指令也有5种具体格式,就是把ADD指令5种具体格式中的ADD换成ADC。3.INC指令(加1指令)
指令格式:INCOPD功能:(OPD)+1→OPD影响的标志位是:AF、OF、PF、SF、ZFINC指令有下面2种具体格式:INCreg ;例INCAL、INCAX和INCEAXINCmem ;例INCBYTEPTR[SI]和INC;BYTEPTR[ESI]3.5.2减法指令
1.SUB指令指令格式:SUBOPD,OPS功能:(OPD)-(OPS)→OPD影响的标志位是:AF、OF、PF、SF、ZF、CFSUB指令也有5种具体格式:2.SBB指令(带借位减法指令)指令格式:SBBOPD,OPS功能:(OPD)-(OPS)-CF→OPD影响的标志位是:AF、OF、PF、SF、ZF、CFSBB指令也有5种具体格式,就是把SUB指令5种具体格式中的SUB换成SBB。例【3-34】利用SUB和SBB指令,实现两个64位二进制数相减。设被减数高、低32位分别存放在EAX和EBX中,减数的高、低32位分别存放在ECX和EDX中,假设(EAX)=99998888H,(EBX)=11112222H,(ECX)=22223333H,(EDX)=88881111H,相减的结果存于(EAX)和(EBX)中。主要程序如下:SUBEBX,EDX;(EBX)←(EBX)-(EDX),结果是;CF=1,(EBX)=88891111HSBBEAX,ECX;(EAX)←(EAX)-(ECX)-CF,结;果是CF=0,(EAX)=77775554H3.DEC指令(减1指令)指令格式:DECOPD功能:(OPD)-1→OPD影响的标志位是:AF、OF、PF、SF、ZFDEC指令有下面2种具体格式:DECreg;例DECEAXDECmem;例DECBYTEPTR[ESI]4.CMP指令(比较指令)
指令格式:CMPOPD,OPS功能:(OPD)-(OPS)影响的标志位是:AF、OF、PF、SF、ZF、CF3.5.3乘法指令
1.MUL指令(无符号数的乘法指令)
指令格式:MULOPS;OPS可以是reg;和mem操作数字节乘法: (AL)*(OPS8)→AX字乘法: (AX)*(OPS16)→DX:AX双字乘法: (EAX)*(OPS32)→EDX:EAX影响的标志位是:CF、OF,不影响AF、PF、SF、ZF。8086乘法运算指令分为无符号数乘MUL和有符号数乘IMUL。乘法在实现字节相乘时乘积放在AX寄存器中,字相乘时乘积放在DX:AX寄存器中,因此乘法指令不会产生溢出和进位,这时用OF和CF位来表示乘积有效数字的长度:
若乘积的高半部分(字节乘法为AH,字乘法为DX)有效(MUL指令是指AH或DX中的内容不为0,IMUL指令指的则是AH或DX中的内容是否为符号位的扩展),则CF和OF都为1,表示DX或AH中含有乘积的有效数字,否则CF和OF为0。给你举个例子吧。无符号数0B4H与11H相乘moval,0b4h;al=b4h=180d(被乘数放在al中)movbl,11h;bl=11h=17d(乘数放在bl中)mulbl;ax=Obf4h=3060d,OF=CF=1(乘积放在ax中。AX高8位不为0)再来一个有符号数乘法的例子。有符号数0B4H与11H相乘moval,0b4h;al=b4h=-76dmovbl,11h;bl=11h=17dimulbl;ax=faf4h=-1292d,OF=CF=1;AX高8位不是低8位的符号扩展,表示含有有效数字计算二进制数乘法:b4h×11h。如果把它当作无符号数,用MUL指令结果为0bf4h;如果看作是有符号数,用IMUL指令则结果为faf4h。由此可见,同样的二进制数看作无符号数与有符号数相乘,即采用MUL与IMUL指令,它们的结果是不相同的。
例【3-35】设(AL)=02H,(BH)=81H,(AL)*(BH)→AX,执行MULBH指令后,(AX)=02H*81H=0102H。2.IMUL指令(带符号数整数乘法指令)
指令基本格式:IMULOPS字节乘法: (AL)*(OPS8)→AX字乘法: (AX)*(OPS16)→DX:AX双字乘法: (EAX)*(OPS32)→EDX:EAX对标志位的影响:与MUL指令相同。3.5.2除法指令:
1.DIV指令(无符号数的除法指令)
指令格式:DIVOPS
字节除法: (AX)/(OPS8)→AL(商)、AH(余数)字除法: (DX:AX)/(OPS16)→AX(商)、DX(余数)双字除法: (EDX:EAX)/(OPS32)→EAX(商)、EDX(余数)对标志位的影响:CF、OF、AF、PF、SF、ZF均未定义。2.IDIV指令(带符号数的除法指令)指令格式:IDIVOPS字节除法: (AX)/(OPS8)→AL(商)、AH(余数)字除法: (DX:AX)/(OPS16)→AX(商)、DX(余数)双字除法: (EDX:EAX)/(OPS32)→EAX(商)、EDX(余数)对标志位的影响:CF、OF、AF、PF、SF、ZF均未定义。3.6逻辑运算指令1.求补指令指令格式:NEGOPD功能:将OPD中的内容逐位取反,且末位加1后送入OPD中,即0减操作数。有两种具体格式:NEGregNEGmem2.求反指令(逻辑非)指令格式:NOTOPD功能:将OPD中的内容逐位取反后再送入OPD中。NOTregNOTmem例【3-37】用NOT和INC指令实现NEG指令功能。用下面两条指令求EAX中二进制数的补码,它们和NEGEAX指令效果是等同的。NOTEAXINCEAX
3.逻辑与指令:
指令格式:ANDOPD,OPS功能:(OPD)∧(OPS)→OPD按位相与影响的标志位是:CF、OF、PF、SF、ZF,而AF未定义。逻辑与的规则是:1∧1=1,1∧0=0,0∧1=0,0∧0=0。4.逻辑测试指令:指令格式:TESTOPD,OPS功能:(OPD)∧(OPS)影响的标志位是:CF、OF、PF、SF、ZF,而AF未定义。5.逻辑或指令语句格式:OROPD,OPS功能:(OPD)∨(OPS)→OPD影响的标志位是:CF、OF、PF、SF、ZF,而AF未定义。逻辑或的规则是:0∨0=0,0∨1=1,1∨0=1,1∨1=1。6.逻辑异或指令
指令格式:XOROPD,OPS功能:(OPD)(OPS)→OPD按位相异或影响的标志位是:CF、OF、PF、SF、ZF,而AF未定义。逻辑异或的规则是:11=0,10=1,01=1,00=0。3.7移位指令8086/8088指令集中的移位指令包括算术移位指令(SAL/SAR)、逻辑移位指令(SHL/SHR)和循环移位指令(ROL、ROR、RCL、RCR)。3.7.1算术移位指令
1.算术左移指令指令格式:SALOPD,1或SALOPD,CL,这是原16位机就具有的算术左移指令。32位机新增的算术左移指令是SALOPD,imm。
2.算术右移指令指令格式:SAROPD,1或SAROPD,CL或SAROPD,imm。3.7.2逻辑移位指令
1.逻辑左移指令指令格式:SHLOPD,1或SHLOPD,CL或SHLOPD,imm。32位机新增的逻辑左移指令。指令格式:SHLDOPD,OPS,imm或SHLDOPD,OPS,CL。例【3-41】用32位指令编写程序时,不能使用完整段格式编写程序,这是因为完整段不可以使用32位寄存器,在简化段格式下,能够在程序的开端作出使用32位寄存器的说明后,于是就可以使用32位寄存器编程。本例中使用32位机指令将bx值移入ax中。
.modelsmall;定义为小模式,数据段、堆栈段及附加数据段在同一个段内,最大为64KB,;代码段是64KB,共计最大长度128KB.386;定义本程序可以使用386指令编程.stack.code.startup;建立段寄存器的值movax,1234hmovbx,5678hshldax,bx,16;32位cpu的指令.exit;退回到调用该程序执行之前的状态end2.逻辑右移指令:指令格式:SHROPD,1或SHROPD,CL或SHROPD,imm。32位机新增逻辑右移指令。指令格式:SHRDOPD,OPS,imm或SHRDOPD,OPS,CL。
例【3-43】利用移位及堆栈指令使AX和BX的值交换,程序如下:
.modelsmall.386.code.startupmovax,1234hax=1234hmovbx,5678hbx=5678hpushaxshrdax,bx,16;bx移入ax中ax=5678hpopbx;堆栈中存放的ax值1234H被弹出给bx.exitend3.7.3循环移位指令
1.不带进位的循环左移指令指令格式:ROLOPD,1或ROLOPD,CL或ROLOPD,imm。2.不带进位的循环右移指令指令格式:ROROPD,1或ROROPD,CL或ROROPD,imm。3.带进位的循环左移指令指令格式:RCLOPD,1或RCLOPD,CL或RCLOPD,imm。4.带进位的循环右移指令指令格式:RCROPD,1或RCROPD,CL或RCROPD,imm。例【3-45】利用循环移位指令将AX中的内容移动到DX中,即实现MOVDX,AX。【程序】codesegment'code'assumecs:codestart:movax,1234hmovcx,16cycle:rorax,1rcrdx,1deccxjnzcyclemovah,4ch//调用中断21h的4ch号功能。
中断21h是DOS系统的系统调用中断,使用ah来选择功能。
4ch号功能是退出程序的意思。int21hcodeendsendstart3.8字符串操作指令
1.字符串传送指令:指令格式:①MOVSOPD,OPS②MOVSB③MOVSW④MOVSD例【3-46】在内存中,一个英文字母表存放在数据段,编写程序使之移动到附加的数据段,并将移动到附加数据段的英文字母显示出来。【程序】datasegment ;数据段,提供源串srcdb'abcdefghijklmnopqrstuvwxyz$'dataendsedatasegment ;附加数据段,提供目的地址destdb27dup(?)edataendscodesegment’code’assumecs:code,ds:data,es:edatastart:movax,datamovds,axmovax,edatamoves,axcld ;设置传送方向movcx,27 ;设置重复次数leasi,srcleadi,destrepmovsb ;重复传送movah,9 ;利用9号中断显示目的串内容
leadx,dest;变量名dest的偏移地址→dxint21hmovah,2 ;利用2号中断显示回车换行movdl,0dhint21hmovdl,0ahint21hmovah,4chint21hcodeendsendstart2.字符串比较指令指令格式:①CMPOPD,OPS②CMPSB ;字节串比较③CMPSW ;字串比较④CMPSD ;双字串比较3.字符串搜索指令:指令格式:①SCASOPD②SCASB ;字节串搜索③SCASW ;字串搜索④SCASD ;双字串搜索4.字符串装入指令:指令格式:①LODSOPS②LODSB ;从源地址中取字节串③LODSW ;从源地址中取字串④LODSD ;从源地址中取双字串5.字符串存储指令:指令格式:①STOSOPD②STOSB ;向目的地址中存字节串③STOSW ;向目的地址中存字串④STOSD ;向目的地址中存双字串例【3-48】下面的程序是将字符串“Readme”从以SOUR为首地址的内存单元传送到以DEST为首地址的内存单元。具体作法是用LODS指令每次从SOUR串中取出一个字符到AL再用STOS指令每次将AL的值存入目的串DEST中,直到传送完毕。【程序】Datasegmentsourdb'readme'n=$-sourdestdb6dup(0)dataendscodesegment'code'assumecs:code,ds:data,es:datastart:movax,data
movds,ax
moves,axmovcx,nleasi,sour;源串首地址的偏移地址→sileadi,dest;目的串首地址的偏移地址→dicld;置df=0,增址传送cycle:lodsb;从源串取出一个字符到alstosb;将al的值存入目的串loopcycle;cx←cx-1,如果cx不等于0则转移到cyclemovah,4chint21hcodeendsendstart3.9控制转移指令
转移指令分条件转移指令和无条件转移指令两大类,其特点是改变程序的执行顺序(即改变指令指针IP/EIP的值),但不改变状态标志位的状态。3.9.1条件转移指令
1.简单条件转移指令
JNC标号地址JNE/JNZ标号地址JS标号地址JNO标号地址JP/JPE标号地址2.无符号数条件转移指令:
无符号数条件转移指令往往跟在比较指令之后,根据运算结果设置的条件标志状态确定转移方向。这类指令将比较对象视为无符号数。根据不同状态,设置了高于(JA的含义是jumpifabove)、高于或等于、低于(JB的含义是jumpifbelow)、低于或等于四条指令。具体情况见表3-9。3.带符号数条件转移指令
带符号数条件转移指令一般也是跟在比较或减法指令之后,根据运算结果设置的标志状态确定转移方向。这类指令将比较对象视为带符号数。根据不同状态,设置了大于(JG的含义是jumpifgreater)、大于或等于、小于(JL的含义是jumpifless)、小于或等于四条指令。例【3-50】设AL=+15=00001111B,BL=11110000B(是-16的补码)。执行CMPAL,BL后,ZF=0,SF=0,OF=0,AL>BL。执行CMPBL,AL后,ZF=0,SF=1,OF=0,BL<AL。4.和CX/ECX有关的转移指令
①LOOP指令格式:LOOP标号②LOOPE/LOOPZ格式:LOOPE标号或LOOPZ标号③LOOPNE/LOOPNZ格式:LOOPNE标号或LOOPNZ标号④JCXZ格式:JCXZ标号⑤JECXZ格式:JECXZ标号3.9.2无条件转移无条件转移指令使CPU无条件地转移到指令中指明的目的地址处执行。名称格式功能段内直接转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大型商业街区改造项目社会稳定风险评估与城市风貌保护研究报告
- 工业互联网网络运维 课件 任务2.2 网络拓扑规划
- 数列性质题目及答案
- 苔题目及答案解析
- 炭块运行工试题及答案
- 养殖鱼塘管理办法
- 兼职人才管理办法
- 内业资料管理办法
- 内部借款管理办法
- 内部计件管理办法
- 白龙江引水工程环境影响报告书(公示版)
- 2024抢救过敏性休克课件
- 杯子直播带货脚本
- JB T 8315-2007变压器用强迫油循环风冷却器
- 项目变更报告
- 劳务合同通用模板电子下载
- 【幼儿自主游戏中教师支持策略研究(论文)11000字】
- FluorPen-FP-110植物荧光测量仪中文说明书
- 模拟电路试卷及答案(十套)及模拟电路基础知识教程
- 娄敬山制灰用灰岩矿资源量核实报告
- 国家电网公司安全文明施工标准规程
评论
0/150
提交评论