
位32位微处理器指令系统.ppt
94页第第3章章 16位位/32位微处理器指令系统位微处理器指令系统 3.1 指令的基本格式3.2 8086/8088的寻址方式3.3 8086/8088的指令系统3.4 80386的寻址方式和指令系统3.5 Pentium新增加的指令 3.1 指令的基本格式指令的基本格式 3.1.1 指令的构成3.1.2 8086/8088的指令格式 3.1.1 指令的构成 指令的构成Ø包括两部分:n表示操作性质或类型编码-操作码n操作对象-操作数Ø一般来说,第一字节表示操作码,第二字节表示寻址方式,第三、四字节表示操作数在内存的位移量或者是立即数(在指令中没有位移量时),第五、六字节表示立即数 3.1.2 8086/8088的指令格式的指令格式 Ø基本格式为: [标号:] 操作码助记符 目的操作数,源操作数 [;注释]n标号为该条指令所在内存单元的符号地址,后面要跟冒号标号一般由字母开头,后跟字母、数字或特殊字符,注意不允许使用保留字,例如:MOV,SEGMENT,END等n操作码助记符,指示CPU执行什么样的操作n操作数分目的操作数和源操作数两种,目的操作数是指令结果存放的位置,源操作数是指令操作的对象。
目的操作数应放在源操作数前,并以逗号隔开n注释用来说明本条指令或一段程序的功能,使程序可读性强注释由分号(;)开始,汇编程序对其不进行处理 3.2 8086/8088的寻址方式的寻址方式 Ø一条汇编语言指令,有两个问题需要关注,一是该条指令将进行什么操作,另一个就是操作的对象和操作后结果的存放位置Ø操作数的寻址方式就是指寻找操作数位置的方式1.立即寻址立即寻址(Immediate addressing)Ø操作数包含在指令中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)Ø这种操作数称为立即数n可以是8位数值(00H~FFH)n也可以是16位数值(0000H~FFFFH)ØMOV AL,80H;将80H送入AL MOV AX,306AH;将306AH送入AXØ立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现Ø操作数直接在指令中取得,不需要使用另外的总线周期,执行时间短、速度快2.寄存器寻址寄存器寻址(Register addressing)Ø操作数存放在CPU的内部寄存器中:n8位寄存器:AH、AL、BH、BL、CH、CL、DH、DLn16位寄存器:AX、BX、CX、DX、SI、DI、BP、SPn4个段寄存器:CS、DS、SS、ESØ寄存器名表示其内容(操作数)。
ØMOV AL,BL;将BL的内容传送到AL中 MOV BX,AX;将AX的内容传送到BX中Ø采用寄存器寻址的指令在执行时,操作数就在CPU中,不需要访问存储器来取得操作数,执行速度快另外寄存器名比内存地址短,指令所占内存空间少 3.直接寻址直接寻址(Direct Addressing)Ø通常把操作数的偏移地址称为有效地址EA (Effective Address) ,EA可通过不同的寻址方式来得到直接寻址方式的有效地址在指令中直接给出Ø默认的段基址在DS段寄存器,可使用段前缀改变Ø用方括号包含有效地址 MOV AX,[1000H];若(DS)=2000H,则将数据段21000H、 21001H两个单元的内容送到AXØ如果有效地址是以符号地址形式提供,则可不加方括号 MOV AX,BUFA;BUFA为符号地址,这时不加跨段前 缀,默认仍为DS数据段如BUFA变量 在附加段中,就必须书写为: MOV AX,ES:BUFA 4.寄存器间接寻址寄存器间接寻址(Register indirect Addressing)Ø有效地址存放在基址寄存器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/DI+8/16位位移量n如果寄存器为BX或BP,则为基址寻址n如果寄存器为SI或DI,则为变址寻址Ø段基址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段前缀改变。
Ø例:MOV AX,[SI+3000H] 的执行结果 设(DS)=4000H,(SI)=2000H,内存单元(45000H)=34H,(45001H)=12H ①首先求操作数的物理地址: 物理地址=(DS)×16+(SI)+3000H=40000H+2000H+3000H=45000H②然后根据该物理地址从内存得到操作数,也即内存单元45000H、45001H的内容将该内容送入AX故(AX)=1234H 6.基址变址寻址基址变址寻址(Based indexed addressing)Ø有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:有效地址=BX/BP+SI/DI +8/16位位移量Ø段基址对应BX寄存器默认是DS,对应BP寄存器默认是SS;可用段前缀改变Ø该寻址方式适用于数组或表格存取ØMOV AX,8[BX+SI] ;默认操作数在数据段中 MOV BX,-6[BP+DI];默认操作数在堆栈段中 MOV BX,ES:[BP+DI] ;操作数在附加段中 7.固定寻址固定寻址Ø固定寻址又叫隐含寻址Ø指令码中不包含指明操作数地址的部分,而其操码本身隐含地指明了操作数地址。
Ø如:十进制调整指令DAA,该指令的功能是对AL寄存器中的内容进行十进制调整,调整后的内容仍存放到AL中Ø隐含寻址的指令,不需要计算EA,执行速度快,而且大多为单字节指令注意注意 Ø立即数、CS和IP不能作为目的操作数Ø两个段寄存器之间不能相互传送数据Ø两个存储单元之间不能直接传送Ø不能将立即数直接传送到段寄存器Ø两个操作数的类型和长度必须一致2)交换指令交换指令XCHG(exchange)Ø格式:XCHG OPD,OPSØ操作数的类型可以为字节或字Ø交换只能在通用寄存器之间、通用寄存器与存储器之间进行3)换码指令换码指令XLAT(translate)Ø格式: XLAT 或 XLAT 表首址Ø功能:使AL中的值变换为内存表格中的对应值Ø它是一条隐含寻址方式的指令,将数据段内有效地址为(BX)+(AL)的内存字节单元中数据送入ALØ该指令常用来查表,即将表头地址赋予BX,再将需求的表内位移地址赋予AL,最后运用XLAT指令即可以将该地址处的表值送到AL 4)堆栈操作指令堆栈操作指令Ø堆栈是一个“后进先出LIFO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址。
Ø堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定Ø堆栈只有两种基本操作:入栈和出栈,对应两条指令PUSH和POP入栈指令入栈指令PUSHØ格式:PUSH OPSØ功能:修改指针:(SP)-2→SP;将OPS指明的寄存器、段寄存器或存储器中的一个字数据压入堆栈的顶部Ø例:假设在指令执行前,(SP)=1000H;(AX)= 1234H则PUSH AX指令执行后,12H被压入堆栈段偏移地址为0FFFH单元,34H被压入堆栈段偏移地址为0FFEH单元,栈顶指针(SP)=0FFEHØPUSH指令在使用应该注意:n源操作数只能是16位,而不能是8位的n源操作数不能为立即数 出栈指令出栈指令POPØ格式:POP OPDØ功能:将栈顶的一个字数据送至OPD指明的寄存器、段寄存器(CS除外)或存储器中;修改指针:(SP)+2→SPØ例:假设在指令执行前,(SP)=0FFEH,(BX)=2004H,并且堆栈段栈顶(0FFEH)单元内存放34H,(0FFFH)单元内存放12H则POP BX指令执行后,1234H被弹出放入BX中,栈顶指针(SP)=1000HØPOP指令在使用时应该注意:n目的操作数只能是16位,而不能是8位的。
n立即数、CS不能作为目的操作数2.标志寄存器传送指令标志寄存器传送指令 ØLAHF指令:取标志寄存器指令将标志寄存器的低8位传送到AH中ØSAHF指令:设置标志寄存器指令将AH的内容传送到标志寄存器的低8位ØPUSHF指令:将标志寄存器的值压入堆栈ØPOPF指令:从堆栈中弹出一个字到标志寄存器中3.目标地址传送指令目标地址传送指令1)取偏移地址指令LEAØ格式:LEA OPD,OPSØ功能:将源操作数的偏移地址送到目的操作数Ø该指令不影响标志位,源操作数必须是存储器操作数,目的操作数必须是16位通用寄存器nLEA SI,TABLE;TABLE为存储器操作数的符号地址nLEA AX,[SI];该指令等效于MOV AX,SI指令,与MOV AX,[SI] 指令的效果不同,注意区别2)传送偏移地址及数据段首址指令LDSØ格式:LDS OPD,OPSØ功能:从源操作数所指定的存储单元中取出某变量的地址指针(共4个字节),将低地址两个字节(偏移量)送到目的操作数,将高地址两个字节(段首址)送到DS中Ø该指令对标志位不影响,源操作数是双字类型存储器操作数,目的操作数必须是16位通用寄存器。
Ø设某双字存储单元的偏移地址为3000H,双字数据为12345678H,则LDS SI,[3000H]指令执行后,(DS)=1234H,(SI)=5678H 3.目标地址传送指令目标地址传送指令(续续)3.目标地址传送指令目标地址传送指令(续续)3)传送偏移地址及附加段首址指令LESØ格式:LES OPD,OPSØ功能:从源操作数所指定的存储单元取出某变量的地址指针(共4个字节),将低地址两个字节(偏移量)送到目的操作数,将高地址两个字节(变量的段首址)送到ES中 4.输入输出指令输入输出指令输入/输出指令用于完成输入/输出端口与累加器(AL/AX)之间的数据传送,指令中给出输入/输出端口的地址 1)输入指令输入指令INØ格式:IN OPD,OPSØ功能:从端口(地址为n或在DX中)输入8位数据到AL或输入16位数据到AXnIN 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端口u输入/输出指令在使用应该注意:n输入/输出指令对标志寄存器没有影响n端口地址大于255时,必须用DX指定端口地址 3.3.2 算术运算类指令算术运算类指令 Ø在8086/8088指令系统中,具有完备的加、减、乘和除运算Ø可以完成带符号和不带符号的8位/16位二进制的算术运算,以及BCD码表示的十进制数的算术运算 1.加法指令加法指令1)不带进位加法指令ADDØ格式:ADD OPD,OPSØ功能:OPS+OPD OPDØ影响标志位CF、AF、PF、SF、OF和ZF2)带进位加法指令ADCØ格式:ADC OPD,OPSØ功能:OPS+OPD+CF OPDØ影响标志位CF、AF、PF、SF、OF和ZFØADC指令常用于多字的加法 1.加法指令加法指令(续续)3)加1指令Ø格式:INC OPDØ功能:将目的操作数OPD的内容加1,并将结果回送到目的操作数。
Ø影响标志位AF、PF、SF、OF和ZF,但不影响CF标志nINC AX;AX中内容加1,结果送回AXnINC BL;BL中内容加1,结果送回BLnINC BYTE PTR [SI] ;将SI所指内存字节单元内容 加1,并回存 2.减法指令减法指令1)不带借位的减法指令SUBØ格式:SUB OPD,OPSØ功能:OPD-OPS OPDØ结果影响标志位CF、AF、PF、SF、OF和ZFnSUB BX,CX;BX的内容减去CX的内容,结果放入BX 2)带借位的减法指令SBBØ格式:SBB OPD,OPSØ功能:OPD-OPS-CFOPDØ结果影响标志位CF、AF、PF、SF、OF和ZF nSBB [SI],AL;SI所指字节单元内容减AL的值,再减 CF,结果存回原内存单元2.减法指令减法指令(续续)3)减1指令Ø格式:DEC OPDØ功能:将目的操作数OPD的内容减1,并将结果回送到目的操作数Ø影响标志位AF、PF、SF、OF和ZF,但不影响CF标志。
nDEC AX;AX的内容减1,结果送回AX nDEC CL;CL的内容减1,结果送回CL 2.减法指令减法指令(续续)4)比较指令Ø格式: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,则目的操作数比源操作数大;如OF≠SF,则目的操作数比源操作数小 2.减法指令减法指令(续续)5)求补指令Ø格式: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.乘法指令乘法指令1)无符号数乘法指令Ø格式: MUL OPSØ功能: 字节乘法: (AL)×(OPS)→AX 字乘法: (AX)×(OPS)→(DX,AX)n例如: MUL BL 指令执行前,(AL)=0B4H=180 ,(BL)=11H=17 指令执行后,(AX)= 0BF4H = 3060, CF=1,OF=1ØMUL指令在使用时应该注意:nOPS不能是立即数。
nMUL指令影响CF、OF标志,不影响其它标志对于字节乘法,若AH≠0,则CF=1,OF=1;否则CF=0,OF=0对于字乘法,若DX≠0,则CF=1,OF=1;否则CF=0,OF=0 3.乘法指令乘法指令(续续)2)有符号数乘法指令Ø格式:IMUL OPSØ功能:字节乘法: (AL)×(OPS)→AX 字乘法: (AX)×(OPS)→(DX,AX)n例如:IMUL BL 指令执行前,(AL)=0B4H=-76,(BL)=11H=17 指令执行后,(AX)=0 FAF4H =-1292,CF=1,OF=1ØIMUL指令的使用注意事项同MUL指令 4.符号扩展指令符号扩展指令1)字节扩展为字指令Ø格式:CBWØ功能:将AL的内容从字节扩展为字,存放到AXØ若AL中数据的最高位为0,则(AH)=00H; 若AL中数据的最高位为1,则(AH)=0FFHØ该指令不影响标志位 2)扩展为双字指令Ø格式:CWDØ功能:将AX的内容从字扩展为双字,存放到DX、AXØ若AX中数据的最高位为0,则(DX)=0000H; 若AX中数据的最高位为1,则(DX)=0FFFFH。
Ø该指令不影响标志位 5.除运算指令除运算指令1)无符号数除法指令Ø格式:DIV OPSØ功能: 字节除法:(AX)/(OPS)→AL(商),AH(余数) 字除法: (DX,AX)/ (OPS)→AX(商),DX(余数)ØDIV指令在使用应该注意:nOPS不能是立即数n除法指令不影响标志位,除0会导致结果溢出,产生溢出中断 5.除运算指令除运算指令(续续)2)有符号数除法指令Ø格式:IDIV OPSØ功能:字节除法: (AX)/(OPS)→AL(商),AH(余数)字除法: (DX,AX)/ (OPS)→AX(商),DX(余数) 6.十进制调整指令十进制调整指令Ø前面的算术运算指令都是二进制运算指令,如何利用它们来进行BCD 码十进制运算?Ø一般方法是:首先对BCD码表示的十进制数进行二进制运算,然后再使用调整指令对运算结果进行调整,得出正确的BCD码表示的十进制运算结果6.十进制调整指令十进制调整指令(续续)1)加法的BCD码调整指令Ø(1)压缩的BCD码调整指令Ø格式: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,35H MOV AL,85H ADD AL,BL DAA 上述指令序列执行后,(AL)=20H ,CF=1,AF=1 6.十进制调整指令十进制调整指令(续续)(2)非压缩的BCD码调整指令Ø格式: 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位清零,并AF→CF。
ØDAA、AAA指令在使用时应该注意:nDAA、AAA指令一般是紧跟在ADD或ADC指令后使用,单独使用没有意义n调整指令只对AL的内容进行调整,故在调整前,务必保证待调整结果出现在AL6.十进制调整指令十进制调整指令(续续)2)减法的BCD码调整指令Ø(1)压缩的BCD码调整Ø格式:DASØ功能:将AL中二进制减法运算的结果调整为两位压缩BCD码,结果仍保留在AL中Ø调整的方法:若 AF=1或AL的低4位大于9,则自动(AL)-06H→AL,1→AF;若 CF=1或AL的高4位大于9,则自动(AL)-60H→AL,1→CF 6.十进制调整指令十进制调整指令(续续)(2)非压缩的BCD码调整指令Ø格式:AASØ功能:将AL 中二进制减法运算结果调整为一位非压缩BCD码,如果有借位,则保留在CF中Ø调整的方法:若AL的低4位大于9或AF=1,则自动将AL的内容减06H,AH内容减1并置AF=CF=1,将AL的高4位清零;若AL的低4位小于或等于9,则仅将AL的高4位清零,并AF→CFØDAS、AAS指令在使用时的注意事项可参考加法调整指令 6.十进制调整指令十进制调整指令(续续)3)乘法的非压缩BCD码调整指令Ø格式:AAMØ功能:将AL中二进制乘法运算结果调整为两位非压缩BCD码,高位放在AH,低位放在AL。
影响标志位PF、SF和ZFØ该指令必须紧跟在MUL之后,且被乘数和乘数必须用非压缩的BCD码表示4)除法的非压缩BCD码调整指令Ø格式:AADØ功能:用在两位非压缩的BCD码相除之前,将AX内容调整为二进制数 3.3.3 逻辑运算与移位类指令 逻辑运算与移位类指令 1.逻辑运算指令2.移位指令3.循环移位指令 1.逻辑运算指令逻辑运算指令逻辑运算指令包括“非”、“与”、“或”、“异或”和“测试”指令,可以对字或字节按位进行逻辑运算 1.逻辑运算指令逻辑运算指令(续续)1)非运算指令Ø格式:NOT OPDØ功能:将目的操作数的内容按位取反后,再送回目的操作数Ø该指令不影响标志位 2)与运算指令Ø格式:AND OPD,OPSØ功能:将目的操作数的内容与源操作数按位相与,结果送回目的操作数Ø影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义 1.逻辑运算指令逻辑运算指令(续续)3)测试指令Ø格式:TEST OPD,OPSØ功能:将目的操作数的内容与源操作数按位相与,但结果不送回目的操作数Ø影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义Ø例子: TEST AL,80H 执行前:(AL) =39H 执行后: ZF=1Ø该指令可以用于判断目的操作数的某个数位是否1。
上例中可以根据ZF=1,判断出AL内容的最高位为零 1.逻辑运算指令逻辑运算指令(续续)4)或运算指令Ø格式:OR OPD,OPSØ功能:将目的操作数的内容与源操作数按位相或,结果送回目的操作数影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义Ø该指令常用来将目的操作数的某一位或几位置15)异或运算指令Ø格式:XOR OPD,OPSØ功能:将目的操作数的内容与源操作数按位异或,结果送回目的操作数影响标志位SF、ZF、PF,使OF=0,CF=0,对AF无定义Ø由于某个操作数和同一个数异或结果为0,故异或运算常被用来比较两数是否相等或初始化某数为0 2.移位指令移位指令Ø这组指令可以对字节或字中的各位进行算术移位和逻辑移位Ø移位次数可以是1也可以大于1若移位次数大于1时,必须将次数预先放入CL也就是说,移位指令中的移位次数的源操作数只能是1或CLØ这组指令影响除AF以外的各个标志位 2.移位指令移位指令(续续)a)算术/逻辑左移 b)算术右移 c)逻辑右移 2.移位指令移位指令(续续)1)算术左移指令Ø格式:SAL OPD,OPSØ功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行左移操作,每次高位进入CF,最低位补0 。
Ø无符号数的算术左移一位相当于目的操作数乘22)逻辑左移指令Ø格式:SHL OPD,OPSØ功能:与算术左移指令SAL完全相同 2.移位指令移位指令(续续)3)算术右移指令Ø格式:SAR OPD,OPSØ功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行右移操作,每次低位进入CF,最高位用移位前的值填补 4)逻辑右移指令Ø格式:SHR OPD,OPSØ功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行右移操作,每次低位进入CF,最高位补0 3.循环移位指令循环移位指令Ø8086/8088指令系统中有4条循环移位指令,其中2条不带进位的循环移位指令, 2条为带进位的循环移位指令Ø循环移位次数OPS的设置和移位指令相同Ø这组指令只影响CF、OF标志位 3.循环移位指令循环移位指令(续续)a)循环左移 b)循环右移 c)带进位循环左移 d)带进位循环右移 3.循环移位指令循环移位指令(续续)1)循环左移指令Ø格式:ROL OPD,OPSØ功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行循环左移操作2)循环右移指令Ø格式:ROR OPD,OPSØ功能:根据源操作数OPS中的移位次数,将目的操作数的内容连续进行循环右移操作。
3.循环移位指令循环移位指令(续续)3)带进位的循环左移指令Ø格式:RCL OPD,OPSØ功能:根据源操作数OPS中的移位次数,连续对目的操作数的内容带CF循环左移操作4)带进位的循环右移指令Ø格式: RCR OPD,OPSØ功能:根据源操作数OPS中的移位次数,连续对目的操作数的内容带CF循环右移操作 3.3.4 串操作类指令串操作类指令 Ø字符串是指存储器中顺序存放、类型相同的字节或字的序列Ø串操作是指对串中每个元素都执行同样的操作,如串传送、比较以及查找等Ø规定一个字符串的长度最长不能超过64K字节,字符串常设置在数据段或附加段中Ø源串存放在数据段,用SI提供源串的偏移地址 目的串存放在附加段,用DI提供目的串的偏移地址Ø当方向标志DF=0,地址指针SI、DI自动增加1(字节串)或2(字串) 当方向标志DF=1,地址指针SI、DI自动减少1(字节串)或2(字串)Ø串操作指令前不加重复前缀,串操作只执行一次如重复执行串操作,可以用CX存放重复的次数,每重复执行一次,CX内容减1当CX内容减为0时,串操作停止1.重复指令前缀重复指令前缀 1)无条件重复前缀REP Ø格式:REPØ功能:用于一个串操作指令的前缀,每重复执行一次串操作指令,CX的内容减1,直到(CX)=0 为止。
Ø执行步骤如下:①先判断CX的内容,如(CX)=0,则串操作停止,否则执行第②步; ②(CX)-1→CX ;③执行其后的串操作指令,转第①步 1.重复指令前缀重复指令前缀(续续)2)相等/为零重复前缀REPE Ø格式:REPEØ功能:用于一个串操作指令的前缀,每重复执行一次串操作指令,CX的内容减1,直到(CX)=0 或ZF=0为止Ø执行步骤如下:①先判断CX的内容,如(CX)=0或ZF=0,则串操作停止,否则执行第②步; ②(CX)-1→CX ;③执行其后的串操作指令,转第①步 1.重复指令前缀重复指令前缀(续续)3)不相等/不为零重复前缀REPNE Ø格式:REPNEØ功能:用于一个串操作指令的前缀,每重复执行一次串操作指令,CX的内容减1,直到(CX)=0 或ZF=1为止Ø执行步骤如下:①先判断CX的内容,如(CX)=0或ZF=1,则串操作停止,否则执行第②步; ②(CX)-1→CX ;③执行其后的串操作指令,转第①步 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.3.5 控制转移类指令控制转移类指令Ø一般情况下指令是顺序地逐条执行的,但实际上程序不可能总是顺序执行,而经常要改变程序的执行流程。
Ø控制转移指令就是用来控制程序的执行流程的Ø程序执行顺序的改变实际上是通过修改代码段寄存器CS和指令指针IP的内容来实现的Ø8086有五种类型的转移指令:无条件转移、条件转移、循环控制、子程序调用及返回和与中断有关的指令 1.无条件转移指令无条件转移指令无条件地转移到指令指定的地址去执行从该地址开始的指令分为:段内转移和段间转移 1)段内直接短转移 Ø格式:JMP SHORT 目标标号Ø功能:无条件地转移到标号所指定的目标地址去执行程序目标地址与JMP指令的下一条指令地址之差在-128~+127字节之间2)段内直接转移 Ø格式:JMP 目标标号 JMP NEAR PTR 目标标号Ø功能:转移的范围扩大到-32768~+32767字节之间3)段内间接转移 Ø格式:JMP WORD PTR OPD Ø功能:转移到OPD所指定的目标地址去执行程序OPD只能是16位寄存器或两个连续存储的内存字节单元转移范围为64KB1.无条件转移指令无条件转移指令(续续)4)段间直接转移 Ø格式:JMP FAR PTR 目标标号Ø功能:将目标标号所在的段基址送CS,将目标标号相对所在段的段内偏移地址送IP。
可以转移范围为1MB5)段间间接转移 Ø格式:JMP DWORD PTR OPDØ功能:目的操作数为双字,将目的操作数的第一个字送IP,将目的操作数的第二个字送CS可以转移范围为1MB2.条件转移指令条件转移指令Ø测试上一条指令对标志位的影响,从而决定程序执行的流程满足条件,则转移,不满足条件则顺序执行Ø转移范围都只有-128~+127个字节所有条件转移指令对标志位均无影响 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有进位则转移JNOOF=0结果不溢出则转移JNCCF=0无进位则转移2)无符号数的条件转移指令无符号数的条件转移指令 JA/JNBECF=0 ∧ ZF=0高于/不低于且不等于(即A>B)则转移JAE/JNBCF=0 ∨ ZF=1高于等于/不低于(即A≥B)则转移JB/JNAECF=1 ∧ ZF=0低于/不高于且不等于(即A<B)则转移JBE/JNACF=1 ∨ ZF=1低于等于/不高于(即A≤B)则转移该组转移指令用于无符号数的比较,并根据比较的结果进行转移。
3)有符号数的条件转移指令有符号数的条件转移指令 该组转移指令用于有符号数的比较,并根据比较的结果进行转移 指令测试条件说明(A,B两数关系)JG/JNLESF=OF ∧ ZF=0大于/不小于且不等于(即A>B)则转移JGE/JNLSF=OF ∨ ZF=1大于等于/不小于(即A≥B)则转移JL/JNGESF≠OF ∧ ZF=0小于/不大于且不等于(即A<B)则转移JLE/JNGSF≠OF∨ ZF=1小于等于/不大于(即A≤B)则转移4)测试测试CX条件转移指令条件转移指令Ø格式:JCXZ 目标标号Ø功能:若(CX)=0,则转移到目标标号所指定地址去执行程序3.循环转移指令循环转移指令一般用它们来实现程序循环,循环的次数必须放在CX寄存器中,这组指令也不影响标志位有三条循环控制指令:n计数循环指令n相等/为零计数循环指令n不相等/不为零计数循环指令 1)计数循环指令计数循环指令Ø格式: LOOP 标号Ø功能:每执行一次LOOP指令,CX的内容减1,若CX≠0,则循环转移到标号所指定的目标地址去重复执行程序,直到CX=0,退出循环,接着执行LOOP指令的下一条指令Ø例: MOV CX,0100H;设置循环次数DELAY:LOOP DELAY2)相等/为零计数循环指令相等/为零计数循环指令Ø格式:LOOPE/LOOPZ 标号Ø功能:每执行一次循环指令,CX的内容减1,若CX≠0且ZF=1,则循环转移到标号所指定的目标地址去重复执行程序,否则执行循环指令的下一条指令。
3)不相等/不为零计数循环指令不相等/不为零计数循环指令Ø格式:LOOPNE/LOOPNZ 标号Ø功能:每执行一次循环指令,CX的内容减1,若CX≠0且ZF=0,则循环转移到标号所指定的目标地址去重复执行程序,否则执行循环指令的下一条指令 4.子程序调用和返回指令子程序调用和返回指令在8086/8088指令系统中,调用子程序或从子程序返回的指令分别为CALL和RET 1)子程序调用指令子程序调用指令(1)段内直接调用Ø格式:CALL 标号Ø功能:首先将返回地址(CALL指令的下一条指令)(16位偏移地址)压入堆栈,然后将标号所指的子程序在本段中的偏移地址送入IP,转子程序执行2)段内间接调用Ø格式:CALL WORD PTR OPD Ø功能:首先将返回地址压入堆栈,然后将目的操作数的内容送入IP,转至同一段内的子程序执行3)段间直接调用Ø格式:CALL FAR PTR 标号Ø功能:首先将断点地址CS、IP顺序压入堆栈,然后将标号所在的段基址送入CS,将标号相对所在段的偏移地址送入IP,转子程序执行4)段间间接调用Ø格式:CALL DWORD PTR OPDØ功能:首先将断点地址CS、IP顺序压入堆栈,然后将有效地址指定的4个字节送入IP、CS(低地址的两个字节送IP,高地址的两个字节送CS),转子程序执行。
2)返回指令返回指令子程序的最后一条指令为返回指令,用来控制程序返回断点地址处(相应CALL指令的下一条指令)继续执行下去1)返回指令Ø格式:RETØ功能:把断点地址从堆栈弹出送IP或IP、CS如该子程序为FAR类型,首先从堆栈弹出一个字送IP(SP+2→SP),再从堆栈弹出一个字送CS (SP+2→SP);如该子程序为NEAR类型,从堆栈弹出一个字送IP(SP+2→SP),从而返回主程序2)带弹出值的返回指令Ø格式:RET nØ功能:n为偶数,在执行RET指令后,再修改指针SP+n→SP,也即先从堆栈弹出断点地址送IP或IP、CS,再废除栈顶的n个字节 注意:注意:ØCALL和RET指令不影响标志位ØCALL和RET指令必须成对使用,与无条件转移指令的不同之处,在于它含有将断点地址入栈和出栈的操作 5.中断和中断返回指令中断和中断返回指令中断和中断返回指令能使CPU暂停执行后续指令,而转去执行相应的中断服务程序或从中断服务程序返回主程序1)软中断指令2)中断返回指令3)溢出中断指令1)软中断指令软中断指令Ø格式:INT nØ功能:n为中断类型码,可以取0~0FFH之间的256个值。
每个中断类型码在中断矢量表中占4个字节,前两个字节用来存放中断服务程序入口地址的偏移地址,后两个字节用来存放段基址ØCPU执行INT指令时,首先将标志寄存器FR 入栈,接着清除IF、TF,然后将当前程序断点的段基址和偏移地址入栈保护,最后将中断矢量表中与中断类型码对应的4个字节内容先后送入IP、CS,这样CPU转去执行中断服务程序 2)中断返回指令中断返回指令Ø格式:IRETØ功能:放在中断服务程序的出口处,由它从堆栈中弹出程序断点分别送IP、CS,并弹出一个字送标志寄存器FR,以退出中断,返回到断点处执行后续程序Ø中断服务程序的最后一条指令必须是IRET 3)溢出中断指令溢出中断指令Ø格式:INTOØ功能:该指令为单字节指令,中断类型码为4,放在有符号的算术运算指令之后,仅当运算产生溢出(OF=1)时,即向CPU发出溢出中断请求 3.3.6 处理器控制类指令处理器控制类指令Ø标志位操作指令Ø外部同步指令 1.标志位操作指令标志位操作指令Ø进位位清0指令:CLCØ进位位求反指令:CMCØ进位位置1指令:STCØ关中断指令:CLI;置IF=0,禁止外部可屏蔽中断Ø开中断指令:STI;置IF=1,允许外部可屏蔽中断。
Ø方向标志清0指令:CLDØ方向标志置1指令:STD2.外部同步指令外部同步指令Ø空操作指令NOP不执行任何操作,其机器码占一个字节Ø暂停指令HLT该指令执行后,使机器暂停工作,使处理器处于停机状态,以等待一次外部中断到来,中断结束后,程序继续执行,处理器继续工作Ø交权指令ESC协处理器在系统加电工作后,就不断检测CPU是否需要协助工作,当发现ESC指令时,被选定的协处理器便开始工作Ø等待指令WAIT该指令每隔5个时钟周期就测试一次TEST信号,若该信号为高电平,CPU继续执行WAIT指令,进入等待状态,否则结束等待,执行后续指令 3.4 80386的寻址方式和指令系统的寻址方式和指令系统3.4.1 80386的寻址方式3.4.2 80386的指令系统 3.4.1 80386的寻址方式的寻址方式Ø80386的寻址方式包括立即寻址、寄存器寻址、直接寻址和寄存器间接寻址Ø按照80386系统的存储器组织方式,逻辑地址由选择子和偏移量组成Ø偏移量由以下四个分量计算得到: ①基址任何通用寄存器都可以作为基址寄存器,其内容即为基址②位移量在指令操作码后面的32位、16位或8位数除了ESP寄存器外,任何通用寄存器都可以作为变址寄存器,其内容即为变址。
④比例因子变址寄存器的值可以乘以一个比例因子,根据操作数的长度可以为1个字节、2个字节、4个字节或8个字节,比例因子相应可以为1、2、4或8Ø由上面4个分量计算偏移量的方法为: 偏移量=基址+变址×比例因子+位移量Ø按照4个分量组合偏移量的不同方法,可以有9种存储器寻址方式,其中8种属于寄存器间接寻址 80386的寻址方式的寻址方式(续续)(1)直接寻址方式Ø位移量就是操作数的有效地址,此位移量包含在指令中Ø例: DEC WORD PTR [200] ;有效地址为200(2)寄存器间接寻址方式Ø基址寄存器的内容为操作数的有效地址Ø例: MOV [EBX],EAX;有效地址在EBX(3)基址寻址方式Ø基址寄存器的内容和位移量相加形成有效地址Ø例如: MOV [EBX+100],EAX ;有效地址为EBX的内容 加100 80386的寻址方式的寻址方式(续续)(4)变址寻址方式Ø变址寄存器的内容和位移量相加形成有效地址。
Ø例:SUB EAX,[ESI],20;有效地址为ESI的内容加20(5)带比例因子的变址寻址方式Ø变址寄存器的内容乘以比例因子,在加位移量相加形成有效地址Ø例:SUB EAX,[ESI*8],7;有效地址为ESI的内容乘以8再加7(6)基址变址寻址方式Ø基址寄存器的内容加上变址寄存器的内容组成有效地址Ø例:SUB EAX,[ESI][EBX] ;有效地址为EBX内容加ESI内容 80386的寻址方式的寻址方式(续续)(7)基址加带比例因子的变址寻址方式Ø变址寄存器的内容乘以比例因子再加上基址寄存器的内容组成有效地址Ø例:MOV ECX,[EDI*2][EBX] ;有效地址为EDI内容乘以2再加EBX内容(8)带位移量的基址加变址寻址方式Ø基址寄存器的内容加位移量,再加上变址寄存器的内容组成有效地址Ø例:MOV EDX,[ESI][EBP+200H] ;有效地址为EBP内容加200H加ESI内容(9)带位移量的基址加带比例因子的变址寻址方式Ø变址寄存器的内容乘以比例因子,再加上基址寄存器内容与位移量之和组成有效地址Ø例:MOV ECX,[EDI*2][EBX+20] ;有效地址为EDI内容乘以2,再加EBX内容再加203.4.2 80386的指令系统的指令系统80386的指令系统是在8086指令系统基础上设计的,并完全兼容8086指令系统,主要差别是80386指令系统扩展了数据宽度,对存储器寻址方式也进行了扩充,另外还增加了少量指令。
