资源描述
第第3章章 16位位/32位微位微处理器指令系理器指令系统 指令指令:要求计算机执行各种特定操作的命令。指令系统指令系统:微机能够识别和执行的全部指令集合。不同的微处理器所对应的指令系统也不相同。本章内容:n指令的基本格式n8086/8088的寻址方式n8086/8088的指令系统n80386的寻址方式和指令系统nPentium新增加的指令3.1 指令的基本格式指令的基本格式本节内容:n指令的构成n8086/8088的指令格式3.1.1指令的构成指令的构成包括两部分:n操作码:表示操作性质或类型编码n操作数:操作对象。一般来说,第一字节表示操作码,第二字节表示寻址方式,第三、四字节表示操作数在内存的位移量或者是立即数(在指令中没有位移量时),第五、六字节表示立即数。3.1.28086/8088的指令格式的指令格式 基本格式基本格式:标号:操作码助记符 目的操作数,源操作数 ;注释n标标号号:为该条指令所在内存单元的符号地址,后面要跟冒号。标号一般由字母开头,后跟字母、数字或特殊字符,不允许使用保留字。n操作码助记符操作码助记符:指示CPU执行什么样的操作。n操操作作数数:分目的操作数和源操作数两种。目的操作数是指令结果存放的位置,源操作数是指令操作的对象。n注注释释:说明本条指令或一段程序的功能,使程序可读性强。汇编程序对其不进行处理。3.2 8086/8088的的寻址方式址方式 一条汇编语言指令,有两个问题需要关注:n该条指令将进行什么操作n操作的对象和操作后结果的存放位置。操作数的寻址方式就是指寻找操作数位置的方式操作数的寻址方式就是指寻找操作数位置的方式。本节内容:n立即寻址n寄存器寻址n直接寻址n寄存器间接寻址n基址寻址和变址寻址n基址变址寻址n固定寻址1.立即立即寻址址操作数包含在指令中,这种操作数称为立即数n可以是8位数值(00HFFH)n也可以是16位数值(0000HFFFFH)MOV AL,80H;将80H送入AL MOV AX,306AH;将306AH送入AX立即数寻址方式常用来给寄存器和存储单元赋值。操作数直接在指令中取得,不需要使用另外的总线周期,执行时间短、速度快。2.寄存器寄存器寻址址操作数在CPU的内部寄存器中:n8位寄存器:AH、AL、BH、BL、CH、CL、DH、DLn16位寄存器:AX、BX、CX、DX、SI、DI、BP、SPn4个段寄存器:CS、DS、SS、ESMOV AL,BL;将BL的内容传送到AL中 MOV BX,AX;将AX的内容传送到BX中采用寄存器寻址的指令在执行时,操作数就在CPU中,不需要访问存储器来取得操作数,执行速度快。另外寄存器名比内存地址短,指令所占内存空间少。3.直接直接寻址址有效地址有效地址EA(Effective Address):操作数的偏移地址。EA可通过不同的寻址方式来得到。直接寻址方式的有效地址在指令中直接给出。默认的段基址在DS段寄存器,可使用段前缀改变。用方括号包含有效地址,如:MOV AX,1000H。如果有效地址是以符号地址形式提供,则可不加方括号。MOV AX,BUFA;BUFA为符号地址,这时不加跨段前 缀,默认仍为DS数据段。如BUFA变量 在附加段中,就必须书写为:MOV AX,ES:BUFA 例子例子段基址:2000H有效地址:1000H物理地址:21000HAX已知:(DS)=2000H,(21000H)=12H,(21001H)=34H。试给出指令 MOV AX,1000H执行后AX的内容。20000H数据段2FFFFH21000H21001H12H34H存储器存储器指令执行后,指令执行后,(AX)=3412H。4.寄存器寄存器间接接寻址址有效地址存放在基址寄存器有效地址存放在基址寄存器BX、BP或变址寄存器或变址寄存器SI、DI中中。如用BX、SI或DI作为间址寄存器,则默认的段基址在DS段寄存器。如用BP作为间址寄存器,则默认的段基址在SS段寄存器。可使用段前缀改变。MOV AX,BX;若(DS)=2000H,(BX)=1000H,则将数据段 21000H、21001H两个单元的内容送到AX中。MOV CX,BP;若(SS)=4000H,(BP)=1000H,则将堆栈段 41000H、41001H两个单元的内容送到CX中。MOV AX,ES:SI;若(ES)=3000H,(SI)=1000H,则将附加段 31000H、31001H两个单元的内容送到AX中。5.基址基址寻址和址和变址址寻址址有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI。有效地址BX/BP/SI/DI8/16位位移量n如果寄存器为BX或BP,则为基址寻址n如果寄存器为SI或DI,则为变址寻址段基址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段前缀改变。例子例子段基址:4000H有效地址:5000H物理地址:45000HAX已知:(DS)=4000H,(SI)=2000H,内存单元(45000H)=34H,(45001H)=12H。试给出指令 MOV AX,SI+3000H执行后AX的内容。40000H数据段4FFFFH45000H45001H34H12H存储器存储器指令执行后,指令执行后,(AX)=1234H。6.基址基址变址址寻址址有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:有效地址BX/BPSI/DI 8/16位位移量段基址对应BX寄存器默认是DS,对应BP寄存器默认是SS;可用段前缀改变。该寻址方式适用于数组或表格存取。MOV AX,8BX+SI;默认操作数在数据段中 MOV BX,-6BP+DI;默认操作数在堆栈段中 MOV BX,ES:BP+DI;操作数在附加段中 7.固定固定寻址址固定寻址又叫隐含寻址。指令码中不包含指明操作数地址的部分,而其操码本身隐含地指明了操作数地址。如:十进制调整指令DAA,该指令的功能是对AL寄存器中的内容进行十进制调整,调整后的内容仍存放到AL中。隐含寻址的指令,不需要计算EA,执行速度快,而且大多为单字节指令。3.3 8086/8088的指令系的指令系统符号的约定:nOPD :目的操作数(8/16位)nOPS :源操作数(8/16位)本节内容:n数据传送类指令n算术运算类指令n逻辑运算与移位类指令n串操作类指令n控制转移类指令n处理器控制类指令3.3.1 数据数据传送送类指令指令数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令。除标志寄存器传送指令外,均不影响标志位。本小节内容:n通用数据传送指令n标志寄存器传送指令n目标地址传送指令n输入/输出指令1.通用数据通用数据传送指令送指令包括:nMOV传送指令nXCHG交换指令nXLAT换码指令n堆栈操作指令1)MOV传送指令送指令格式:格式:MOV OPD,OPS MOV指令是使用最多的指令,它可以完成CPU内寄存器之间、寄存器与存储器之间的数据传送,还可以将立即数送入寄存器或内存。MOV AL,BL;将寄存器BL的内容传送到寄存器AL中。MOV DI,AX;将寄存器AX的内容传送到DI和DI+1所 指的内存字单元中。MOV CX,1000H;将数据段中偏移地址1000H和1001H 单元的内容送CX中。MOV BL,40;将立即数40传送到寄存器BL。MOV指令在使用指令在使用时应该注意注意 立即数、CS和IP不能作为目的操作数。两个段寄存器之间不能相互传送数据。两个存储单元之间不能直接传送。不能将立即数直接传送到段寄存器。两个操作数的类型和长度必须一致。2)XCHG交交换指令指令格式:格式:XCHG OPD,OPS操作数的类型可以为字节或字。交换只能在通用寄存器之间、通用寄存器与存储器之间进行。XCHG AX,BX;AX和BX的内容互换3)XLAT换码指令指令格式:格式:XLAT 或或 XLAT 表首址表首址功能:使AL中的值变换为内存表格中的对应值。它是一条隐含寻址方式的指令。将数据段内有效地址为(BX)+(AL)的内存字节单元中数据送入AL。该指令常用来查表,即将表头地址赋予BX,再将需求的表内位移地址赋予AL,最后运用XLAT指令即可以将该地址处的表值送到AL。XLAT换码指令的功能指令的功能图数据段存储器存储器表BXAL+BX+ALAL4)PUSH入入栈指令与指令与POP出出栈指令指令堆栈是一个“后进先出LIFO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段基址。堆栈的存取操作都发生在栈顶;用堆栈指针寄存器SP指定。入入栈指令指令PUSH格式:格式:PUSH OPS功能:修改指针:(SP)-2SP;将OPS指定的寄存器、段寄存器或存储器中的一个字数据压入堆栈的顶部。PUSH指令在使用时应该注意:n源操作数只能是16位,而不能是8位的。n源操作数不能为立即数。PUSH指令的例子指令的例子例:假设在指令执行前,(SP)=1000H;(AX)=1234H。试分析PUSH AX指令的执行结果。SP堆栈段存储器存储器1000H0FFFH0FFEHSPAX12H34H出出栈指令指令POP格式:格式:POP OPD功能:将栈顶的一个字数据送至OPD指明的寄存器、段寄存器(CS除外)或存储器中;修改指针:(SP)+2SP。POP指令在使用时应该注意:n目的操作数只能是16位,而不能是8位的。n立即数、CS不能作为目的操作数。POP指令的例子指令的例子例:假设在指令执行前,(SP)=0FFEH,(BX)=2004H,并且堆栈段栈顶(0FFEH)单元内存放34H,(0FFFH)单元内存放12H。试分析POP BX指令的执行结果。SP堆栈段存储器存储器1000H0FFFH0FFEHSPBX12H34H=1234H2.标志寄存器志寄存器传送指令送指令 LAHF指指令令:取标志寄存器指令。将标志寄存器FR的低8位传送到AH中。SAHF指指令令:设置标志寄存器指令。将AH的内容传送到标志寄存器FR的低8位。PUSHF指指令令:将标志寄存器FR的值压入堆栈。POPF指指令令:从堆栈中弹出一个字到标志寄存器FR中。3.目目标地址地址传送指令送指令包括:n取偏移地址指令LEAn传送偏移地址及数据段首址指令LDSn传送偏移地址及附加段首址指令LES1)取偏移地址指令取偏移地址指令LEA格式:格式:LEA OPD,OPS功能:将源操作数的偏移地址送到目的操作数。该指令不影响标志位,源操作数必须是存储器操作数,目的操作数必须是16位通用寄存器。nLEA SI,TABLE;TABLE为存储器操作数的符号地址nLEA AX,SI;该指令等效于MOV AX,SI指令,与MOV AX,SI 指令的效果不同,注意区别。格式:格式:LDS OPD,OPS功能:从源操作数所指定的存储单元中取出某变量的地址指针(共4个字节),将低地址两个字节(偏移量)送到目的操作数,将高地址两个字节(段首址)送到DS中。该指令对标志位不影响,源操作数是双字类型存储器操作数,目的操作数必须是16位通用寄存器。2)传送偏移地址及数据段首址指令送偏移地址及数据段首址指令LDSLDS指令的例子指令的例子设某双字存储单元的偏移地址为3000H,双字数据为12345678H,试分析LDS SI,3000H指令的执行结果。DS存储器存储器数据段3000H12H34H3001H3002H3003H56H78HSI=1234H=5678H3)传送偏移地址及附加段首址指令送偏移地址及附加段首址指令LES格式:格式:LES OPD,OPS功能:从源操作数所指定的存储单元取出某变量的地址指针(共4个字节),将低地址两个字节(偏移量)送到目的操作数,将高地址两个字节(变量的段首址)送到ES中。4.输入入输出指令出指令输入/输出指令用于完成输入/输出端口与累加器(AL/AX)之间的数据传送,指令中给出输入/输出端口的地址。包括:n输入指令INn输出指令OUT1)输入指令入指令IN格式:格式:IN OPD,OPS功能:从端口(地址为n或在DX中)输入位数据到AL或输入16位数据到AX。nIN AL,40H;从40H端口读入一个字节送ALnIN AX,80H;从80H端口读入一个字节送AL,从 81H端口读入一个字节送AHnMOV DX,8F00H;将 端 口 地 址 8F00H送 DXIN AL,DX;从8F00H端口读入一个字节送AL 2)输出指令出指令OUT格式:格式:OUT OPD,OPS功能:从AL输出8位数据或从AX输出16位数据到端口(地址为n或在DX中)。nOUT 40H,AL;将AL内容送40H端口nOUT 80H,AX;将AL内容送80H端口,将AH的内容送81H端口nMOV DX,8F00H;将端口地址8F00H送DXOUT DX,AL;将AL内容送8F00H端口输入入/输出指令在使用出指令在使用时应该注意注意输入/输出指令对标志寄存器没有影响。端口地址大于255时,必须用DX指定端口地址。3.3.2 算算术运算运算类指令指令 可以完成带符号和不带符号的8位/16位二进制的算术运算,以及BCD码表示的十进制数的算术运算。包括:n加法指令n减法指令n乘法指令n符号扩展指令n除运算指令n十进制调整指令1.加加法指令法指令包括:n不带进位加法指令ADDn带进位加法指令ADCn加1指令INC1)不不带进位加法指令位加法指令ADD格式:ADD OPD,OPS功能:OPS+OPD OPD。影响标志位CF、AF、PF、SF、OF和ZF。2)带进位加法指令位加法指令ADC格式:ADC OPD,OPS功能:OPS+OPD+CF OPD。影响标志位CF、AF、PF、SF、OF和ZF。ADC指令常用于多字的加法。3)加指令加指令格式:INC OPD功能:将目的操作数OPD的内容加,并将结果回送到目的操作数。影响标志位AF、PF、SF、OF和ZF,但不影响CF标志。nINC AX;AX中内容加,结果送回AXnINC BL;BL中内容加,结果送回BLnINC BYTE PTR SI;将SI所指内存字节单元内容 加,并回存。2.减法指令减法指令包括:n不带借位的减法指令SUBn带借位的减法指令SBBn减1指令DECn比较指令CMPn求补指令NEG1)不不带借位的减法指令借位的减法指令SUB格式:SUB OPD,OPS功能:OPD-OPS OPD结果影响标志位CF、AF、PF、SF、OF和ZF。nSUB BX,CX;BX的内容减去CX的内容,结果放入BX2)带借位的减法指令借位的减法指令SBB格式:SBB OPD,OPS功能:OPD-OPS-CFOPD结果影响标志位CF、AF、PF、SF、OF和ZF。nSBB SI,AL;SI所指字节单元内容减AL的 值,再减CF,结果存回原内 存单元。3)减指令减指令DEC格式:DEC OPD功能:将目的操作数OPD的内容减,并将结果回送到目的操作数。影响标志位AF、PF、SF、OF和ZF,但不影响CF标志。nDEC AX;AX的内容减,结果送回AX。nDEC CL;CL的内容减,结果送回CL。4)比比较指令指令CMP格式:CMP OPD,OPS功能:目的操作数OPD减去源操作数OPS,结果不回送。但影响标志位CF、AF、PF、SF、OF和ZF。nCMP AL,09H;将AL的内容和09H比较,结果影响标志位可以根据标志位的变化,来判断比较结果。n通过ZF的值来判断两数是否相等。若ZF=1,说明两数相等;否则,两数不等。n通过CF、OF和SF的变化来判断无符号数或有符号数的大小:l对于无符号数,如CF=0,则目的操作数比源操作数大;如CF=1,则目的操作数比源操作数小。l对于有符号数,如OF=SF,则目的操作数比源操作数大;如OFSF,则目的操作数比源操作数小。5)求求补指令指令NEG格式:NEG OPD功能:由目的操作数OPD求补,将其结果送回目的操作数。实际做0-OPDOPD运算。影响标志位CF、AF、PF、SF、OF和ZF。nMOV AL,05HNEG AL;(AL)=0FBH,CF=1nMOV AL,-05HNEG AL;(AL)=05H,CF=1 3.乘法指令乘法指令包括:n无符号数乘法指令MULn有符号数乘法指令IMUL1)无符号数乘法指令无符号数乘法指令MUL格式:MUL OPS功能:字节乘法:(AL)(OPS)AX 字乘法:(AX)(OPS)(DX,AX)图示示MUL指令在使用时应该注意:OPS不能是立即数。MUL指令只影响CF、OF标志:n对于字节乘法,若AH0,则CF=1,OF=1;否则CF=0,OF=0。n对于字乘法,若DX0,则CF=1,OF=1;否则CF=0,OF=0。2)有符号数乘法指令有符号数乘法指令IMUL格式:IMUL OPS功能:字节乘法:(AL)(OPS)AX 字乘法:(AX)(OPS)(DX,AX)IMUL指令的使用注意事项同MUL指令。4.符符号号扩展指令展指令包括:n将字节扩展为字指令CBWn将字扩展为双字指令CWD1)将字将字节扩展展为字指令字指令CBW格式:CBW功能:将AL的内容从字节扩展为字,存放到AX。若AL中数据的最高位为0,则(AH)=00H;若AL中数据的最高位为1,则(AH)=0FFH。该指令不影响标志位。2)将字将字扩展展为双字指令双字指令CWD格式:CWD功能:将AX的内容从字扩展为双字,存放到DX、AX。若AX中数据的最高位为0,则(DX)=0000H;若AX中数据的最高位为1,则(DX)=0FFFFH。该指令不影响标志位。5.除除运算指令运算指令包括:n无符号数除法指令DIVn有符号数除法指令IDIV1)无符号数除法指令无符号数除法指令DIV格式:DIV OPS功能:字节除法:(AX)/(OPS)AL(商),AH(余数)字除法:(DX,AX)/(OPS)AX(商),DX(余数)图示示DIV指令在使用应该注意:nOPS不能是立即数。n除法指令不影响标志位,除0会导致结果溢出,产生溢出中断。2)有符号数除法指令有符号数除法指令IDIV格式:IDIV OPS功能:字节除法:(AX)/(OPS)AL(商),AH(余数)字除法:(DX,AX)/(OPS)AX(商),DX(余数)6.十十进制制调整指令整指令前面的算术运算指令都是二进制运算指令,如何利用它们来进行BCD 码十进制运算?一般方法是:首先对BCD码表示的十进制数进行二进制运算,然后再使用调整指令对运算结果进行调整,得出正确的BCD码表示的十进制运算结果。包括:n加法的BCD码调整指令n减法的BCD码调整指令n乘法的非压缩BCD码调整指令AAMn除法的非压缩BCD码调整指令AAD1)加法的加法的BCD码调整指令整指令包括:n压缩BCD码调整指令DAAn非压缩BCD码调整指令AAA(1)压缩BCD码调整指令整指令DAA格式:DAA功能:将AL中二进制加法运算的结果调整为两位压缩BCD码,结果仍保留在AL中。调整的方法:若AL的低4位大于9,则AL的内容加06H,并AF位置1;若AL的高4位大于9,则AL的内容加60H,并CF位置1;若 AF=1,则低4位要加6;若 CF=1,则高4位要加6。例如:MOV BL,34H MOV AL,56H ADD AL,BL DAA 上述指令序列执行后,(AL)=90H,CF=0,AF=0。0011 0100 0101 0110 1000 1010 0110 1001 0000(2)非非压缩BCD码调整指令整指令AAA格式:AAA功能:将AL中二进制加法运算结果调整为一位非压缩BCD码,调 整 后 的 结 果 仍 保 留 在 AL中,如 果 向 高 位 有 进 位(AF=1,CF=1),则AH的内容加1。调整的方法:若AL的低4位大于9或AF=1,则自动将AL的内容加06H,AH内容加1并置AF=CF=1,将AL的高4位清零;若AL的低4位小于或等于9,则仅将AL的高4位清零,并AFCF。DAA、AAA指令在使用时应该注意:nDAA、AAA指令一般是紧跟在ADD或ADC指令后使用,单独使用没有意义。n调整指令只对AL的内容进行调整,故在调整前,务必保证待调整结果出现在AL。2)减法的减法的BCD码调整整指令指令包括:n压缩BCD码调整指令DASn非压缩BCD码调整指令AAS(1)压缩BCD码调整指令整指令DAS格式:DAS功能:将AL中二进制减法运算的结果调整为两位压缩BCD码,结果仍保留在AL中。调整的方法:n若 AF=1或 AL的 低 4位 大 于 9,则 自 动(AL)-06HAL,1AF;n若 CF=1或 AL的 高 4位 大 于 9,则 自 动(AL)-60HAL,1CF。(2)非非压缩BCD码调整指令整指令AAS格式:AAS功能:将AL 中二进制减法运算结果调整为一位非压缩BCD码,如果有借位,则保留在CF中。调整的方法:n若AL的低4位大于9或AF=1,则自动将AL的内容减06H,AH内容减1并置AF=CF=1,将AL的高4位清零;n若AL的低4位小于或等于9,则仅将AL的高4位清零,并AFCF。DAS、AAS指令在使用时的注意事项可参考加法调整指令。3)乘法的非乘法的非压缩BCD码调整指令整指令AAM格式:AAM功能:将AL中二进制乘法运算结果调整为两位非压缩BCD码,高位放在AH,低位放在AL。影响标志位PF、SF和ZF。该指令必须紧跟在MUL之后,且被乘数和乘数必须用非压缩的BCD码表示。4)除法的非除法的非压缩BCD码调整指令整指令AAD格式:AAD功能:用在两位非压缩的BCD码相除之前,将AX内容调整为二进制数。3.3.3逻辑运运算与移位算与移位类指令指令包括:n逻辑运算指令n移位指令n循环移位指令1.逻辑运运算指令算指令可以对字或字节按位进行逻辑运算。包括:n非运算指令NOTn与运算指令ANDn测试指令TESTn或运算指令ORn异或运算指令XOR1)非运算指令非运算指令NOT格式:NOT OPD功能:将目的操作数的内容按位取反后,再送回目的操作数。该指令不影响标志位。2)与运算指令与运算指令AND格式:AND OPD,OPS功能:将目的操作数的内容与源操作数按位相与,结果送回目的操作数。影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义。例如:AND AL,0FH 执行前:(AL)=39H 执行后:(AL)=09HAND指令常用于屏蔽不需要的位,上例中将AL高4位屏蔽,取得低4 位。3)测试指令指令TEST格式:TEST OPD,OPS功能:将目的操作数的内容与源操作数按位相与,但结果不送回目的操作数。影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义。例子:TEST AL,80H 执行前:(AL)=39H 执行后:ZF=1该指令可以用于判断目的操作数的某个数位是否1。上例中可以根据ZF=1,判断出AL内容的最高位为零。4)或运算指令或运算指令OR格式:OR OPD,OPS功能:将目的操作数的内容与源操作数按位相或,结果送回目的操作数。影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义。该指令常用来将目的操作数的某一位或几位置1。5)异或运算指令异或运算指令XOR格式:XOR OPD,OPS功能:将目的操作数的内容与源操作数按位异或,结果送回目的操作数。影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义。由于某个操作数和同一个数异或结果为0,故异或运算常被用来比较两数是否相等或初始化某数为0。2.移位指令移位指令这组指令可以对字节或字中的各位进行算术移位和逻辑移位。移位次数可以是也可以大于。若移位次数大于时,必须将次数预先放入CL。这组指令影响除AF以外的各个标志位。包括:n算术左移指令SALn逻辑左移指令SHLn算术右移指令SARn逻辑右移指令SHR1)算算术左移指令左移指令SAL格式:SAL OPD,OPS功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行左移操作,每次高位进入CF,最低位补0。例3.18 MOV CL,3 SAL AL,CL 执行前:(AL)=01H 执行后:(AL)=08H,CF=0无符号数的算术左移一位相当于目的操作数乘2。2)逻辑左移指令左移指令SHL格式:SHL OPD,OPS功能:与算术左移指令SAL完全相同。3)算算术右移指令右移指令SAR格式:SAR OPD,OPS功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行右移操作,每次低位进入CF,最高位用移位前的值填补。例如:SAR BH,CL 执行前:(BH)=84H,(CL)=2 执行后:(BH)=0E1H,CF=04)逻辑右移指令右移指令SHR格式:SHR OPD,OPS功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行右移操作,每次低位进入CF,最高位补0。例如:SHR AL,CL 执行前:(AL)=9AH,(CL)=4 执行后:(AL)=09H,CF=1 图3.2 移位指令操作移位指令操作过程程3.循循环移位指令移位指令循环移位次数的设置和移位指令相同。这组指令只影响CF、OF标志位。循环移位指令常用于按位检查某单元的内容或实现某单元的半字或半字节互换等。包括:n循环左移指令ROLn循环右移指令RORn带进位的循环左移指令RCLn带进位的循环右移指令RCR1)循循环左移指令左移指令ROL格式:ROL OPD,OPS功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行循环左移操作。例如:ROL DL,CL 执行前:(DL)=0FAH,(CL)=4 执行后:(DL)=0AFH,CF=12)循循环右移指令右移指令ROR格式:ROR OPD,OPS功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行循环右移操作。3)带进位的循位的循环左移指令左移指令RCL格式:RCL OPD,OPS功能:根据源操作数OPS中的移位次数,连续对目的操作数的内容带CF循环左移操作。4)带进位的循位的循环右移指令右移指令RCR格式:RCR OPD,OPS功能:根据源操作数OPS中的移位次数,连续对目的操作数的内容带CF循环右移操作。例3.19 有一无符号32位二进制数存放在DX、AX,其高16位在DX,低16位在AX,以下指令序列实现对该数的除2操作。SHR DX,1 RCR AX,1图3.3 循循环移位指令的操作移位指令的操作过程程3.3.4 串操作串操作类指令指令字符串是指存储器中顺序存放的类型相同的字节或字的序列。串操作是指对串中每个元素都执行同样的操作。规定一个字符串的长度最长不能超过64K字节。源串存放在数据段,用SI提供源串的偏移地址。目的串存放在附加段,用DI提供目的串的偏移地址。当方向标志DF=0:地址指针SI、DI自动加1(字节串)或2(字串)当方向标志DF=1:地址指针SI、DI自动减1(字节串)或2(字串)串操作指令前不加重复前缀,串操作只执行一次。如重复执行串操作,可以用CX存放重复的次数,每重复执行一次,CX内容减1。当CX内容减为0时,串操作停止。3.3.4 串操作串操作类指令指令(续)包括:n重复指令前缀n数据字节串/字串传送指令n数据字节串/字串比较指令n数据字节串/字串检索指令n数据字节串/字串读出指令n数据字节串/字串写入指令1.重重复指令前复指令前缀 包括:n无条件重复前缀REPn相等/为零重复前缀REPE/REPZn不相等/不为零重复前缀REPNE/REPNZ1)无条件重复前无条件重复前缀REP格式:REP功能:用于一个串操作指令的前缀,每重复执行一次串操作指令,CX的内容减1,直到(CX)=0 为止。执行步骤如下:先判断CX的内容,如(CX)=0,则串操作停止,否则执行第步;(CX)-1CX;执行其后的串操作指令,转第步。2)相等相等/为零重复前零重复前缀REPE/REPZ格式:REPE/REPZ功能:用于一个串操作指令的前缀,每重复执行一次串操作指令,CX的内容减1,直到(CX)=0 或ZF=0为止。执行步骤如下:先判断CX的内容,如(CX)=0或ZF=0,则串操作停止,否则执行第步;(CX)-1CX;执行其后的串操作指令,转第步。3)不相等不相等/不不为零重复前零重复前缀REPNE/REPNZ格式:REPNE/REPNZ功能:用于一个串操作指令的前缀,每重复执行一次串操作指令,CX的内容减1,直到(CX)=0 或ZF=1为止。执行步骤如下:先判断CX的内容,如(CX)=0或ZF=1,则串操作停止,否则执行第步;(CX)-1CX;执行其后的串操作指令,转第步。2.数据字数据字节串串/字串字串传送指令送指令 格式:格式:MOVSB/MOVSW功能:将数据段中由(DS:SI)指向的源串的一个字节(字)传送到附加段由(ES:DI)指向的目的串中,且相应修改地址指针,使其指向下一个字节(字)。例:将内存单元首地址3100H起的100个字节传送到首地址2800H的内存单元。CLD MOV SI,3100H MOV DI,2800H MOV CX,100 REP MOVSB 3.数据字数据字节串串/字串比字串比较指令指令格式:格式:CMPSB/CMPSW功能:将数据段中由(DS:SI)指向源串的一个字节(字)减去附加段由(ES:DI)指向的目的串的一个字节(字),不回送结果,只根据结果影响标志位,并相应修改地址指针,使其指向下一个字节(字)。例:检 查 内 存 单 元 首 地 址2200H起的50个字节与首地址3200H起的50个字节是否对应相等。如相等,则BX=0;若不相等,BX指向第一个不相等的字节单元。AL存放第一个不相等的源串内容。CLD MOV SI,2200H MOV DI,3200H MOV CX,50 REPE CMPSB JZ LP1 DEC SI MOV BX,SI MOV AL,SI JMP LP2 LP1:MOV BX,0 LP2:4.数据字数据字节串串/字串字串检索指令索指令格式:格式:SCASB/SCASW功能:将AL(AX)的内容减去附加段由(ES:DI)指向的目的串的一个字节(字),不回送结果,只根据结果影响标志位,并相应修改地址指针,使其指向下一个字节(字)。例:在内存附加段首地址为4300H起的100个字节中,查找是否有“*”,如有,则将偏移地址送BX,否则BX=0。CLD MOV DI,4300H MOV AL,*REPNZ SCASB JNZ LP1 DEC DI MOV BX,DI ;找到“*”,偏移地址送BX JMP LP2LP1:MOV BX,0 ;未找到LP2:5.数据字数据字节串串/字串字串读出指令出指令格式:格式:LODSB/LODSW功能:将数据段中由(DS:SI)指向源串的一个字节(字)读出,放入AL(AX)中,并相应修改地址指针,使其指向下一个字节(字)。6.数据字数据字节串串/字串写入指令字串写入指令格式:格式:STOSB/STOSW功能:将AL(AX)的内容写入附加段中由(ES:DI)指向的目的串一个字节(字)中,并相应修改地址指针,使其指向下一个字节(字)。例3.23 将内存数据段首地址为1800H起的100个字节清零。CLD MOV DI,1800H MOV CX,100 XOR AL,AL REP STOSB3.3.5 控制控制转移移类指令指令控制转移指令用来控制程序的执行流程。程序执行顺序的改变实际上是通过修改代码段寄存器CS和指令指针IP的内容来实现的。包括:n无条件转移指令n条件转移指令n循环转移指令n子程序调用和返回指令n中断和中断返回指令1.无条无条件件转移指令移指令无条件地转移到指令指定的地址去执行从该地址开始的指令。包括:n段内直接短转移n段内直接转移n段内间接转移n段间直接转移n段间间接转移1)段内直接短段内直接短转移移格式:JMP SHORT 目标标号功能:无条件地转移到标号所指定的目标地址去执行程序。目标地址与JMP指令的下一条指令地址之差在-128+127字节之间。2)段内直接段内直接转移移格式:JMP 目标标号 JMP NEAR PTR 目标标号功能:转移的范围扩大到-32768+32767字节之间。3)段内段内间接接转移移格式:JMP WORD PTR OPD 功能:转移到OPD所指定的目标地址去执行程序。OPD只能是16位寄存器或两个连续存储的内存字节单元。转移范围为64KB。4)段段间直接直接转移移格式:JMP FAR PTR 目标标号功能:将目标标号所在的段基址送CS,将目标标号相对所在段的段内偏移地址送IP。可以转移范围为1MB。5)段段间间接接转移移格式:JMP DWORD PTR OPD功能:目的操作数为双字,将目的操作数的第一个字送IP,将目的操作数的第二个字送CS。可以转移范围为1MB。例如:JMP DWORD PTRBX 执行前:(BX)=2000H,(DS)=5000H,(52000H)=0200H,(52002H)=0400H 执行后:(IP)=0200H,(CS)=0400H,CPU转到地址为04200H单元执行程序。2.条件条件转移指令移指令满足条件,则转移,不满足条件则顺序执行。转移范围都只有-128+127个字节。所有条件转移指令对标志位均无影响。包括:n单标志位转移指令n无符号数的条件转移指令n有符号数的条件转移指令n测试CX条件转移指令1)单标志位志位转移指令移指令 指 令测试条件含 义指 令测试条件含 义JZ/JEZF=10/相等则转移JP/JPEPF=1低8位中“1”的个数为偶数则转移JNZ/JNEZF=0非0/不相等则转移JSSF=1结果为负则转移JNP/JPOPF=0低8位中“1”的个数为奇数则转移JNSSF=0结果非负则转移JOOF=1结果溢出则转移JCCF=1有进位则转移JNOOF0结果不溢出则转移JNCCF0无进位则转移2)无符号数的条件无符号数的条件转移指令移指令 该组转移指令用于无符号数的比较,并根据比较的结果进行转移。3)有符号数的条件有符号数的条件转移指令移指令 该组转移指令用于有符号数的比较,并根据比较的结果进行转移。4)测试CX条件条件转移指令移指令格式:格式:JCXZ 目标标号目标标号功能:若(CX)=0,则转移到目标标号所指定地址去执行程序。3.循循环转移指令移指令一般用它们来实现程序循环,循环的次数必须放在CX寄存器中,这组指令也不影响标志位。包括:n计数循环指令n相等/为零计数循环指令n不相等/不为零计数循环指令1)计数循数循环指令指令格式:格式:LOOP 标号标号功能:每执行一次LOOP指令,CX的内容减,若CX0,则循环转移到标号所指定的目标地址去重复执行程序,直到CX=0,退出循环,接着执行LOOP指令的下一条指令。例:MOV CX,0100H;设置循环次数DELAY:LOOP DELAYLOOP指令执行转移时,用9个时钟周期,结束循环指向下一条指令时,用5个时钟周期,程序员可以设置循环次数,来控制延迟的时间。2)相等相等/为零零计数循数循环指令指令格式:格式:LOOPE/LOOPZ 标号标号功能:每执行一次循环指令,CX的内容减,若CX0且ZF=1,则循环转移到标号所指定的目标地址去重复执行程序,否则执行循环指令的下一条指令。3)不相等不相等/不不为零零计数循数循环指令指令格式:格式:LOOPNE/LOOPNZ 标号标号功能:每执行一次循环指令,CX的内容减,若CX0且ZF=0,则循环转移到标号所指定的目标地址去重复执行程序,否则执行循环指令的下一条指令。4.子程序子程序调用和返回指令用和返回指令包括:n子程序调用指令CALLn返回指令RET1)子子程序程序调用指令用指令包括:n段内直接调用n段内间接调用n段间直接调用n段间间接调用(1)段内直接段内直接调用用格式:格式:CALL 标号标号功能:首先将返回地址(CALL指令的下一条指令)(16位偏移地址)压入堆栈,然后将标号所指的子程序在本段中的偏移地址送入IP,转子程序执行。(2)段内段内间接接调用用格式:格式:CALL WORD PTR OPD 功能:首先将返回地址压入堆栈,然后
展开阅读全文