《《基本指令系统》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《基本指令系统》PPT课件.ppt(111页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章第三章 80868086基本指令系统基本指令系统o8086全部指令按功能可分成六大类:数据传送指令、算术运算指令、逻辑指令、串操作指令、控制转移指令和处理机控制指令。本章主要介绍以下内容:数据传送指令算术运算指令位操作指令字符串操作指令 32位CPU扩展的指令3.1 数据传送指令 数据传送指令负责将数据、地址或立即数传送到寄存器或存储单元中。在8086/8088 CPU指令系统中,数据传送指令共有14条分5组,它们是:(1)通用数据传送指令:MOV、XCHG、XLAT(2)堆栈操作指令:PUSH、POP(3)标志寄存器传送指令:LAHF、SAHF、PUSHF、POPF(4)地址传送指令:
2、LEA、LDS、LES(5)输入输出指令:IN、OUT其中除标志寄存器传送指令外,数据传送指均不影响任何标志位。3.1 数据传送指令3.1.1 机器指令格式指令:机器语言的一条语句,它是一组有意义的 二进制代码,由操作码字段和操作数字段 两个部分组成。操作码字段:表示该指令应进行什么性质的操作。操作数字段:指出指令执行的参与者,也就是各 种操作的对象。图3-1指令的一般格式 3.1 数据传送指令3.1.2 通用数据传送指令 通用数据传送指令负责CPU内部的寄存器以及内存单元之间的数据传递,是数据传送指令中使用最多的一组指令。该类指令主要包括:MOV、XCHG和XLAT指令。3.1 数据传送指令
3、一、基本的传送指令MOV(Move)o格式:MOV DEST,SRC ;(DEST)(SRC)其中:(DEST)、(SRC)分别为源和目的操作数。例:MOV AL,BL ;BL中的8位数据送AL MOV ES,DX ;DX中16位数据送ES MOV AX,BX;MOV CX,1000H MOV DX,5040;立即数5040送DX注:对段寄存器赋值时,只能通过寄存器赋值,不能用立即数直 接赋值。允许的操作数组合:允许的操作数组合:允许的操作数组合:允许的操作数组合:o SRC 可为:立即数、通用寄存器、存储器、段寄存器。DEST可为:通用寄存器、存储器、段寄存器 DEST和SRC可以有9种组合
4、,如下图所示:(1)通用寄存器到通用寄存器 如:MOVAX,BX;(2)立即数到通用寄存器 如:MOVAX,03H;(3)立即数到存储单元 如:MOVBYTE PTR 2000H,12H(4)存储单元到通用寄存器 如:MOVAX,2000H;(5)通用寄存器到存储单元 如:MOV 2000H,AX;图3-2 MOV指令传送示意图o(6)通用寄存器到除CS外的段寄存器 如:MOVDS,AX;。(7)段寄存器到通用寄存器 如:MOVAX,DS;(8)存储器到除CS外的段寄存器 如:MOVES,2000H;(9)段寄存器到存储器 如:MOV2000H,DS;二、交换指令 XCHG(Exchange)
5、格式:XCHG DEST,SRC ;(DEST)(SRC)功能:将两个操作数DEST与SRC的内容互换.允许的操作数组合:交换可以在通用寄存器之间或通用寄存器与存储器之间进行,但不能在两个存储单元之间直接进行,DEST 与SRC可以为字或者是字节。例例:XCHG AL,BL ;AL和BL的内容互换 XCHG BX,CX ;BX和CX的内容互换。XCHG 1200H,CX;CX中的内容和1200H,;1201H两单元的内容互换 三、查表换码指令三、查表换码指令 XLATXLAT(Translate)格式:XLAT;AL(BX+AL)表:256字节的数据区。BX BX指向表的首地址 AL 指向数据
6、表某项地址(0255)。执行XLAT时,将BX+AL指向字节单元中的值送AL。该指令操作数全为隐含该指令操作数全为隐含,换码表首地址在换码表首地址在BXBX中中,欲读取欲读取数据表单元偏移量在数据表单元偏移量在ALAL中。中。例:例:MOV BX,1000H MOV AL,04H XLAT ;AL(BX+AL)=(1004H)=50H换码过程:3.1.3 堆栈操作指令堆栈操作指令堆栈及堆栈操作指令(1)堆栈的概念 堆栈是内存的一个逻辑段,当这个段被指定为堆栈后,可用堆栈操作指令对它进行特殊规则的访问,这个规则就是:不论入栈还是出栈,都只能从栈顶处进行,堆栈内数据遵循先进后出,后进先出的原则。(
7、2)堆栈的设置 8086/8088中专门有2个寄存器用于堆栈操作:堆栈段寄存器SS和堆栈指针寄存器SP。SS用来存放堆栈段的段基址,SP用于指示堆栈的顶部单元的段内偏移量,开始时堆栈内没有数据,栈顶就是栈底,故开始时要将栈底单元的偏移量赋给它,以指明栈低位置。3.1 数据传送指令二、堆栈操作指令二、堆栈操作指令 堆栈堆栈按“后进先出”原则设计的数据区。堆栈段地址由SS段寄存器提供堆栈区操作数据地址由堆栈指针寄存器SP提供。SP的初值是指向的地址为栈栈底底,进行堆栈数据操作后SP指向栈栈顶顶地址。必须为字操作数必须为字操作数1入栈指令PUSH(Push onto the stack)格式:PUS
8、H SRC;SPSP-2,(SP+1,SP)(SRC)o8088的入栈过程:(1)SPSP-1,调整堆栈指针,指向一个空地址(新栈顶)(2)(SP)(SRCH),源操作数高字节送SP指向的单元;(3)SPSP-1,调整堆栈指针,指向一个空地址SP;(4)(SP)(SRCL),源操作数低字节送SP指向的单元。o8086的入栈过程:(1)SPSP-2,调整堆栈指针,指向一个空地址;(2)(SP)(SRC),源操作数(字)送SP指向的单元。例例1 1:PUSH AX PUSH BX 2.2.出栈指令出栈指令POPPOP(Pop from the stack)格式:POP DEST;(DEST)(SP
9、+1,SP),SPSP+2 ;或(DEST)(SP),SPSP+2o8088的出栈过程(1)(DESTL)(SP),源操作数低字节(SP)送目的;(2)SPSP+1,调整堆栈指针SP;(3)(DESTH)(SP),源操作数高字节(SP)送目的;(4)SPSP+1,再调整堆栈指针SP。o8086的出栈操作(1)(DEST)(SP),源字操作数(SP)送目的;(2)SPSP+2,调整堆栈指针SP。例例2:将例1堆栈内容,仍弹出给AX、BX。POP BX POP AX例例3 :将例1堆栈内容,弹出给BX、AX,交换出栈。POP AX POP BX3.1 数据传送指令o3.1.4 标志传送指令标志寄存
10、器是一个存放条件标志、控制标志的寄存器,主要用于反映处理器的状态和运算结果的某些特征及控制指令的执行。标志传送指令主要用于对标志寄存器的内容进行读取和修改,共包括4条指令:LAHF、SAHF、PUSHF和POPF。1)LAHF读标志指令读标志指令格式:LAHF执行操作:(AH)(PSW的低8位)该指令的两个操作数均是隐含的,源操作数为标志寄存器的低字节,目的操作数为AH寄存器。其中,标志寄存器的低字节包含SF、ZF、AF、PF和CF,分别对应第7、6、4、2和0位,而第5、3、1位无定义。2)SAHF取标志指令取标志指令格式:SAHF执行操作:(AH)(PSW的低8位)该指令的两个操作数均是隐
11、含的,源操作数为AH寄存器,目的操作数为标志寄存器的低字节。3)PUSHF标志进栈指令标志进栈指令格式:PUSHF执行操作:(SP)(SP)-2 (SP)+1,(SP)(PSW)该指令的两个操作数均是隐含的,源操作数为标志寄存器,目的操作数为指针SP所指向的堆栈顶部的一个字单元。其功能是将标志寄存器的内容压入堆栈。4)POPF标志出栈指令标志出栈指令格式:POPF执行操作:(PSW)(SP)+1,(SP)(SP)(SP)+2该指令的两个操作数均是隐含的,源操作数为指针SP所指向的堆栈顶部的一个字单元,目的操作数为标志寄存器。其功能是将堆栈顶部字单元内容弹出到标志寄存器中。3.1.5 地址传送指
12、令地址传送指令 用于传送段地址或偏移地址的指令一、取有效地址指令一、取有效地址指令 LEA LEA(Load effective address)格式:LEA reg16,mem16 ;reg16 mem16 功能将源操作数所在单元的16位偏移量(mem16),送到16位寄存器(reg16)目的中。例例:LEA AX,2728;将2728单元的偏移量送AX。LEA BX,BP+SI ;BX中的内容为BP+SI的值 LEA SP,0482 ;使堆栈指针SP为4823.1 数据传送指令二二、将将地地址址指指针针装装到到DSDS和和目目的的寄寄存存器器 LDS LDS(Load DS with po
13、inter)格式:LDS reg16,mem32;reg16(mem32),DS (mem32+2)功能把指向mem32开始的四个地址单元内容,高字(段地址)传送到DS中,低字(偏移量)送目的寄存器(reg16)。例1:设2130H-2133H四个单元中,存放着一个地址,2131H、2130H中存地址的偏移量为2211H,2133H、2132H中存段地址值为4433H,执行指令:LDS DI,2130H;DI2211H,DS4433H。三、将地址指针装到三、将地址指针装到ESES和另一个寄存器和另一个寄存器LESLES(Load ES with pointer)格式:LES reg16,mem
14、32;reg16(mem32),;ES(mem32+2)功能把指向mem32开始的四个地址单元内容,高字(段地址)传送到ES中,低字(偏移量)送目的寄存器(reg16)。例2:条件同例1 LES DI,2130H;DI2211H,ES4433H。3.1.6 输入输入/输出指令输出指令 8086/8088 CPU由于采用独立编址方式,因此必须使用专门的输入/输出指令。这类指令利用累加器AL或AX和外设接口中的端口以字节或字为单位进行信息的传输。由于专门用到了累加器,所以又称累加器专用传送指令。共包括两条指令:IN和OUT。3.1 数据传送指令o由于8086/8088 CPU外设最多可以有6553
15、6个端口,端口号为0000H0FFFFH,因此源操作数有两种格式:当端口号为00H0FFH时(即前256个端口),端口号以立即数的形式直接在指令中指定,这就是长格式中的PORT;当端口号位于0100H0FFFFH时,应先用MOV指令将端口号传送到DX寄存器中,再使用短格式访问端口。1)IN输入指令输入指令格式:IN AL,PORT 长格式字节操作 IN AX,PORT 长格式字操作 IN AL,DX 短格式字节操作 IN AX,DX 短格式字操作执行操作:(AL)(PORT)长格式字节操作 (AX)(PORT+1,PORT)长格式字操作 (AL)(DX)短格式字节操作 (AX)(DX)+1,(
16、DX)短格式字操作2)OUT输出指令输出指令格式:OUT PORT,AL 长格式字节操作 OUT PORT,AX 长格式字操作 OUT DX,AL 短格式字节操作 OUT DX,AX 短格式字操作执行操作:(AL)(PORT)长格式字节操作 (AX)(PORT+1,PORT)长格式字操作 (AL)(DX)短格式字节操作 (AX)(DX)+1,(DX)短格式字操作 算术运算指令负责执行加、减、乘、除四则基本运算。它包括无符号数、有符号数的二进制算术运算和十进制算术运算调整指令,它们中有双操作数指令,也有单操作数指令。3.2 算术运算指令o3.2.1 加法指令加法指令1.1.不带进位位的加法指令不
17、带进位位的加法指令 ADD ADD(Add)格式:ADD DEST,SRC;DEST(DEST)+(SRC)例例:ADD AL,90H;ADD BX,23OOH;ADD SI,CX ;ADD BX+DI,AX ;ADD AX,BX+3000H ;3.2 算术运算指令2.2.带进位位的加法指令带进位位的加法指令ADCADC(Add with the carry)格式:ADC DEST,SRC ;DEST(DEST)+(SRC)+CFADC与ADD指令的区别,是加进位标志CF。例例:ADC AX,DI ;AX AXDICF ADC BX,SI ;BX(SI)+BX+CF ADC BX,1OOOH;
18、BX BX+1OOOH+CF ADC AL,53 ;AL AL+53+CF例:例:两个4字节的无符号数,分别放在2000H和2100H开始的存储单元中,低位在前,高位在后,两数相加运算后,和放在2000H开始的内存单元中。程序如下:CLC ;清进位位CF MOV SI,2000H ;取第一个数的首地址 MOV AX,SI ;将第一个数的低16位取到AX MOV DI,2100H ;取第二个数的首地址 ADC AX,DI ;第一个数和第二个数的低16位及CF0相加 MOV SI,AX ;低16位相加的结果送到2000H和2001H单元 MOV AX,SI+2 ;取第一个数的高16位送到AX中 A
19、DC AX,DI+2 ;两个数的高l6位连同进位位相加 MOV SI+2,AX ;高16位相加的结果送到2002H,2003H单元 3增量指令增量指令INCINC(Increment)格式:INC DEST ;DEST(DEST)+1用于循环程序中修改指针和循环次数。例例:INC CL ;将CL中的内容加1 INC BX ;将BX中的内容加1 INCBYTEPTRBX+SI+1500 o3.2.2 减法指令减法指令1 1不带借位的减法指令不带借位的减法指令 SUBSUB(Subtract)格式:SUB DEST,SRC ;DEST(DEST)(SRC)例例:SUB AX,CX SUB BP+4
20、,CL SUB AX,60 SUB SI,3010H SUB BYTE PTRDI,1OH 2.2.带借位的减法指令带借位的减法指令 SBBSBB(Subtract with borrow)格式:SBB DEST,SRC;DEST(DEST)(SRC)CF例:例:SBB BX,1840H SBB WORD PTR SI+2,2OOOH 3.3.减量指令减量指令 DECDEC(Decrement)格式:DEC DEST ;DEST(DEST)1例:DEC AX DEC BYTE PTR DI+5 4.4.取补指令取补指令 NEGNEG(Negate)格式:NEG DEST ;DEST0-(DES
21、T)例例:MOV AL,01110011B NEG AL ;AL10001101B MOV BX,1111000011110000B NEG BX ;BX0000111100010000B5.比较指令比较指令CMP CMP(Compare)格式:CMP DEST,SRC;FLAGS(DEST)(SRC)oCMP执行两个数的相减操作,只影响标志寄存器(AF,CF,OF,SF,PF和ZF),不影响DEST。oCMP后面要有一个条件转移指令,判断状态。例:例:CMP AX,1000H ;将AX的内容和1000H相减,影响标志位 CMP AX,BX+DI+100 ;将 AX的 值 和 字 存 储 单
22、元(BX+DI+100);数相比较,影响标志位 o3.2.3 乘法指令乘法指令1.1.无符号数乘法无符号数乘法MULMUL(unsigned multiple)格式:MUL SRC;o两字节相乘:AXAL*(SRC)o两字相乘:(DX,AX)AX*(SRC)2.2.带符号数乘法带符号数乘法IMULIMUL(signed multiple)格式:IMUL SRC ;o两字节相乘:AXAL*(SRC),结果带符号o两字相乘:(DX,AX)AX*(SRC),带符号o3.2.4 除法指令除法指令1.无符号数除法无符号数除法DIVDIV(unsigned divide)格式:DIV SRC;o16 8位
23、:ALAX/(SRC)(商),AHAX/(SRC)(余数)o3216位:AX(DX,AX)/(SRC)(商),DX(DX,AX)/(SRC)(余数)2 2有符号数除法有符号数除法IDIVIDIV(signed divide)格式:IDIV SRC;操作与DIV相同,但结果带符号。o3.2.5 符号扩展指令符号扩展指令1.1.字节转换为字字节转换为字CBW CBW (Convert byte into word)格式:CBW ;将AL中的符号扩展到AH中。例:例:MOV AL,10011010B CBW;AX1111111110011010B2.字转换为双字字转换为双字CWDCWD (Conve
24、rt word into double word)格式:CWD ;将AX中的符号扩展到DX中。o3.2.6 十进制调整指令十进制调整指令 BCD(binary-coded decimal)是一种二进制的数字编码形式,是用二进制编码的十进制数,又称二进码十进数。它利用了4个二进制位来储存一个十进制的数码,由于常用的BCD码中从左到右每一位的1分别表示8、4、2、1,所以这种代码又称8421BCD码。在IBM-PC中,表示十进制数的BCD码有压缩BCD码和非压缩BCD码两种格式。所谓压缩BCD码格式(packed BCD format),指的是用4位二进制数表示一位BCD码,用一个字节表示的两位B
25、CD码。非压缩型BCD码格式(unpacked BCD format)是指一个字节可存放一个一位十进制数,其中高4位的内容不做规定(也有部分书籍要求为0,二者均可),低4位二进制数表示该位十进制数,1.1.压缩压缩BCDBCD码加法累加器调整指令码加法累加器调整指令DAADAA(Decimal Adjust for Addition)格式:DAA ;对AL的值调整为正确的压缩BCD码。执行DAA前两个压缩型BCD码相加的结果已存于AL中。DAA调整的过程:若 (AL&OFH)9 或标志 AF=1 则 ALAL+6,AF1 若 AL9FH或CF1 则 ALAL+60H,CF1 例例:MOV AL
26、,16H ;AL=16 MOV CL,18H ;BL=18 ADD AL,CL ;AL=2EH,不符合1618=34 DAA ;调整后,AL=34H2 2压缩压缩BCDBCD码减法调整指令码减法调整指令DASDAS(Decimal Adjust for Subtraction)格式:DAS ;与DAA类似,将AL中的结果,调整为正确压缩BCD码 调整操作:若(AL&0FH)9或AF=1 则ALAL6,AF1 若AL9FH或CF=1 则ALAL60H,CF1 例:例:MOV AL,86H;AL=86 MOV BL,07H;BL7 SUB AL,BL;AL7FH,AF1,CF0 DAS;AL79H
27、,AF1,CF03.3.非压缩非压缩BCDBCD码加法累加器调整指令码加法累加器调整指令AAAAAA(ASCII Adjust for Addition)格式:AAA o非压缩BCD码相加的结果已存于AL中,oAAA调整AL为正确的非压缩BCD码。oAAA调整的过程:若(AL&OFH)9 或标志 AF=1 则 ALAL+6,AHAH+1,AF1 CFAF,AL(AL&OFH)否则 AL(AL&OFH)例例:MOV AL,09H ;AL=9 MOV CL,08H ;CL=8 ADD AL,CL ;AL+CLAL=11H,与8+9=17不相符 AAA ;调整后 AH=00000001(十位),AL
28、=00000111(个位)4非压缩非压缩BCDBCD码减法累加器调整指令码减法累加器调整指令AASAAS(ASCII Adjust for Subtraction)格式:AAS ;与AAA类似,将AL中的减结果,调整为正确非压缩BCD码。调整操作:若(AL&0FH)9或AF=1 则 ALAL6,AHAH1 AF1,CFAF AL(AL&0FH)否则 AL(AL&0FH)例例:MOV AX,0107H ;AL=7(个位),AH1(十位)MOV BL,09H ;BL=9 SUB AL,BL ;ALBLALFEH AAS ;AL=08,AH=00H,AF=CF=15 5 AAMAAM非压缩非压缩BC
29、DBCD码乘法调整指令码乘法调整指令格式:AAM执行功能:将AL中的积值调整为非压缩BCD码并送回AX中。指令执行前必须先执行MUL指令,将两个非压缩BCD码相乘(此时要求其高四位为0),且积值保存在AL中。调整方法:把AL寄存器的内容除以0AH,商放在AH寄存器中,余数保存在AL寄存器中。该指令根据AL寄存器的内容设置SF、ZF和PF标志位,对CF、AF和OF标志位无定义。6 6 AAD非压缩非压缩BCD码除法调整指令码除法调整指令格式:AAD执行功能:除法运算前,先对被除数AX的内容进行调整。调整方法:(AL)(AH)0AH+(AL),(AH)0若被除数是存放在AX中的两位非压缩BCD数,
30、其中AH中为十位,AL中为个位,且AH和AL的高4位均为0;除数是一位非压缩BCD数,同样要求高4位为0,则这两个数用DIV指令相除前,必须先用AAD指令将AX中的被除数调整为二进制数,放在AL寄存器中。该指令根据AL寄存器的内容设置SF、ZF和PF标志位,对CF、AF和OF标志位无定义。3.3 位操作指令3.3.1 3.3.1 逻辑运算指令逻辑运算指令1.1.逻辑与逻辑与ANDAND(and)格式:AND DEST,SRC ;DEST(DEST)(SRC)应应用用:与与指指令令可可使使一一个个操操作作数数在在其其它它位位不不变变情情况况下下将将某某些些位位置置0.0.要保持不变的位应与要保持
31、不变的位应与1 1相与要置相与要置0 0的位应与的位应与0 0相与。相与。例:AND AL,0FH ;高四位清零,低四位不变2.2.逻辑或逻辑或OROR(or)格式:OR DEST,SRC ;DEST(DEST)(SRC)应应用用:或或指指令令可可以以使使一一个个操操作作数数在在其其它它位位不不变变的的情情况况下下,将将某某些些位位置置1.1.要要保保持持不不变变的的位位应应与与0 0相相或或,要要置置1 1的的位位应应与与1 1相相或。或。例:OR AL,02H;将D1位置置1,其他位不变。3.3.逻辑非逻辑非NOTNOT(not)格式:NOT DEST ;DEST(DEST)4.4.逻辑异
32、或逻辑异或XORXOR(exclusive or)格式:XOR DEST,SRC;(DEST)(DEST)(SRC)异异或或指指令令可可以以使使一一个个操操作作数数在在其其它它位位不不变变的的情情况况下下,将将某某些些位位取取反反。要要保保持持不不变变的的位位应应与与0 0相相异异或或,要要取取 反的位应与反的位应与1 1相异或。相异或。常常用用在在一一些些程程序序的的开开头头使使某某个个寄寄存存器器清清0 0,以以配配合合初初始始化工作的完成。化工作的完成。例:例:XOR AX,AX;XOR AX,AX;使累加器使累加器AXAX清清0 0,CF=0CF=0。5.5.测试指令测试指令TESTT
33、EST(test)格式:TEST DEST,SRC ;FLAGS(DEST)(SRC)TEST指令一般用来检测指定位是1还是0,而这个指定位往往对应一个物理量。例如某一个状态寄存器的最低位反映一种状态,为1时说明信号满足要求,设某状态位连接到寄存器的D0位,检测时可以先将状态寄存器的内容读到AL中,再用TEST AL,01指令,此后就可以通过对ZF的判断来了解此状态位是否为1。如果ZF=1,说明结果为0,即状态位为0,条件不满足,如果ZF=0说明结果不为0,即状态位不为0,而为1,所以条件满足3.3.2 移位指令移位指令移位指令,可8位/16位操作数(OPRD)移1位或移CL位。1.1.非循环
34、移位指令非循环移位指令(1)(1)算术左移指令算术左移指令 SALSAL(Shift Arithmetic Left)格式1:SAL OPRD,1;左移1位,最高位移入CF,最低位移入0格式2:SAL OPRD,CL;左移CL位,最高位移入CF,最低位移入0(2 2)逻辑左移指令)逻辑左移指令 SHLSHL(Shift Logic Left)格式1:SHL OPRD,1;同SAL 格式2:SHL OPRD,CL;同SAL(3 3)算算术术右右移移指指令令 SARSAR(Shift Arithmetic Right)格式1:SAR OPRD,1;右移1位,最低位移入CF,最高位右移同时再填入最高
35、位格式2:SAR OPRD,CL;右移CL位,最低位移入CF,最高位右移同时再填入最高位(4 4)逻辑右移指令)逻辑右移指令 SHRSHR(Shift Logic Right)格式1:SHR OPRD,1;右移1位,最低位移入CF,最高位移入0 格式2:SHR OPRD,CL;右移CL位,最低位移入CF,最高位移入0 2.2.循环移位指令循环移位指令(1)(1)不带进位位的循环左移指令不带进位位的循环左移指令 ROLROL(Rotate Left)格式1:ROL OPRD,1;OPRD左移1位,最高位移入CF,同时移回最低位格式2:ROL OPRD,CL;OPRD左移CL位,每次移位,最高位移
36、入CF,同时移回最低位(2)(2)不带进位位的循环右移指令不带进位位的循环右移指令 RORROR(Rotate Right)格式1:ROR OPRD,1;OPRD右移1位,最低位移入CF,同时移回最高位格式2:ROR OPRD,CL;OPRD右移CL位,每次移位,最低位移入CF,同时移回最高位(3)(3)带带进进位位位位的的循循环环左左移移指指令令 RCLRCL(Rotate through CF Left)格式1:RCL OPRD,1;OPRD左移1位,最高位移入CF,原CF位移回最低位格式2:RCL OPRD,CL;OPRD左移CL位,每次移位,最高位移入CF,原CF位移回最低位(4)(4
37、)带带进进位位位位的的循循环环右右移移指指令令 RCRRCR(Rotate through CF Right)格式1:RCR OPRD,1;OPRD左移1位,最低位移入CF,原CF位移回最高位格式2:RCR OPRD,CL;OPRD左移CL位,每次移位,最低位移入CF,原CF位移回最高位3.4 字符串操作字符串操作指令指令串传送MOVS串比较CMPS串扫描SCAS串装入LODS串送存STOS针对数据块或字符串的操作;可实现存储器到存储器的数据传送;待操作的数据串称为源串,目标地址称为目标串。串操作指令的特点o源串一般存放在数据段,偏移地址由SI指定。允许段重设;o目标串必须在附加段,偏移地址由
38、DI指定;o指令自动修改地址指针,修改方向由DF决定。DF=0 增地址方向;DF=1 减地址方向;o数据块长度值由CX指定o可增加自动重复前缀以实现自动修改CX内容。串操作指令流程取源串地址取源串地址取目标串地址取目标串地址设串长度设串长度传送一个字节或字传送一个字节或字修改地址指针修改地址指针修改串长度值修改串长度值传送完否?传送完否?串传送MOVS(move string)把字节或字操作数从主存的源地址传送至目的地址MOVSB;字节串传送:ES:DIDS:SI,;SISI1,DIDI1MOVSW;字串传送:ES:DIDS:SI,;SISI2,DIDI2指令应用程序功能演示例:字节串传送mo
39、v si,offset sourcemov di,offset destinationmov cx,100;cx传送次数 cld ;设置DF=0,实现地址增加again:movsb ;传送一个字节(可否用movsw)dec cx ;传送次数减1jnz again ;判断传送次数cx是否为0;不为0,转移again位置执行 ;否则,结束该段程序的功能是将数据段中由source指示的100个字节数据,传送到附加段由destination指示的主存区。串存储STOS(store string)把AL或AX数据传送至目的地址STOSB;字节串存储:字节串存储:ES:DIAL,;DIDI1STOSW;字
40、串存储:字串存储:ES:DIAX,;DIDI2指令应用程序例:串存储mov ax,0mov di,0mov cx,8000h;cx传送次数(321024)cld;DF=0,地址增加again:stosw;传送一个字dec cx;传送次数减1jnz again;判断传送次数cx是否为0程序段功能是什么?可以将CLD改为STD吗可不用给DI赋值吗如何改用STOSB串读取串读取LODS(load string)把指定主存单元的数据传送给把指定主存单元的数据传送给AL或或AXLODSB;字节串读取:字节串读取:ALDS:SI,;SISI1LODSW;字串读取:字串读取:AXDS:SI,;SISI2指令
41、应用程序例:串读取(上段:准备)mov si,offset blockmov di,offset dplusmov bx,offset dminusmov ax,dsmov es,ax;所有数据都在一个段中,所以设置es=dsmov cx,count;cx字节数cld例3.6.5:串读取(下段:判断)go_on:lodsb;从block取出一个数据test al,80h;检测符号位,判断是正是负jnz minus;符号位为1,是负数,转向minusstosb;符号位为0,是正数,存入dplusjmp again;程序转移到again处继续执行minus:xchg bx,distosb;把负数存
42、入dminusxchg bx,diagain:dec cx;字节数减1jnz go_on;完成正负数据分离 该段程序的功能是什么?串比较串比较CMPS(compare string)将主存中的源操作数减去至目的操作数,以便设将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系。置标志,进而比较两操作数之间的关系。CMPSB;字节串比较:字节串比较:DS:SIES:DI;SISI1,DIDI1CMPSW;字串比较:字串比较:DS:SIES:DI,;SISI2,DIDI2指令应用程序例:比较字符串是否相同mov si,offset string1mov di,offset
43、string2mov cx,countcldagain:cmpsb;比较两个字符jnz unmat;有不同字符,转移到有不同字符,转移到unmatdec cxjnz again;进行下一个字符的比较进行下一个字符的比较mov al,0;字符串相等,设置00h标记jmp output;转向outputunmat:mov al,0ffh;设置ffh标记output:mov result,al;输出结果标记串扫描SCAS(scan string)将将AL/AX减去至目的操作数,以便设置标志,进减去至目的操作数,以便设置标志,进而比较而比较AL/AX与操作数之间的关系。与操作数之间的关系。SCASB;
44、字节串扫描:ALES:DI,;DIDI1SCASW;字串扫描:AXES:DI,;DIDI2指令应用程序例:查找字符串中的空格例:查找字符串中的空格mov di,offset stringmov al,20hmov cx,countcldagain:scasb;搜索jz found;为0(ZF=1),发现空格dec cx;不是空格jnz again;搜索下一个字符.;不含空格,则继续执行found:.重复前缀指令(repeat)串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但在串操作指令前,可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中。重复前缀分2类,3条指令
45、:o配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀o配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀REP重复前缀指令oREP前缀可以理解为:前缀可以理解为:当数据串没有结束当数据串没有结束(CX0),),则继续传送则继续传送REP;每执行一次串指令,每执行一次串指令,CX减减1;直到;直到CX0,重复执行结束重复执行结束REPZ/REPNZ重复前缀指令oREPZ/REPE当数据串没有结束(CX0),并且串相等(ZF1),则继续比较。oREPNZ/REPNE当数据串没有结束(CX0),并且串不相等(ZF0),则继续比较。REPZ;每执行一次串指令,每执行一次串指
46、令,CX减减1;并判断;并判断ZF是否为是否为0,;只要;只要CX0或或ZF0,重复执行结束重复执行结束REPNZ;每执行一次串指令,每执行一次串指令,CX减减1;并判断;并判断ZF是否为是否为1,;只要;只要CX0或或ZF1,重复执行结束重复执行结束3.5.1 32位指令运行环境位指令运行环境32位的80 x86微处理器有3种工作模式:实模式、保护模式和虚拟8086模式。1)实模式实模式是为了和8086处理器兼容而设置的。在实模式下,80386处理器就相当于一个快速的8086处理器。3.5 32位位CPU扩展的指令扩展的指令2)保护模式保护模式是80386处理器的主要工作模式。当80386工
47、作在保护模式下时,它的所有功能都是可用的。3)虚拟8086模式为了在保护模式下继续提供和8086处理器的兼容,80386又设计了一种虚拟8086模式,以便可以在保护模式的多任务条件下,有的任务运行32位程序,有的任务运行MS-DOS程序。3.5.2 32位位CPU寄存器组和寻址寄存器组和寻址方式的变化方式的变化80386微处理器共有7类34个寄存器,包括通用寄存器组、段寄存器、指令指针和标志寄存器、系统地址寄存器、控制寄存器、调试寄存器、测试寄存器。通常应用程序主要使用前3类标志寄存器EFLAGS 标志寄存器EFLAGS,由8086的FLAGS寄存器扩展而来,低12位与8086的标志寄存器FL
48、AGS的低12位含义完全相同,其他各标志位的含义如下:oIOPL(I/O privilege level)占两个二进制位,表示I/O特权级。如果当前特权级小于或等于IOPL,就可以执行I/O操作,否则将出现一个保护性异常。IOPL只能由特权级为0的程序或任务来修改。oNT(nested task)表示嵌套任务,用于控制中断返回指令IRET。当NT=0时,用堆栈中保存的值恢复EFLAGS、CS和EIP,从而实现返回;若NT=1,则通过任务切换实现中断返回。oVM(virtual-8086 mode)表示虚拟8086模式。如果VM被置位且80386已处于保护模式下,则CPU切换到虚拟8086模式,
49、此时,对段的任何操作又回到了实模式,如同在8086下运行一样。oRF(resume flag)表示恢复标志(又称重启标志),与调试寄存器一起用于断点和单步操作。当RF=1时,下一条指令的任何调试故障将被忽略,不产生异常中断;当RF=0时,调试故障被接受,并产生异常中断(常用于调试失败后,强迫程序恢复执行,在成功执行每条指令后,RF自动复位)。oAC(alignment check)表示对齐检查(只有运行在特权级3的程序才执行地址对齐检查,特权级0、1、2忽略该标志)。当AC=1且CR0中的AM=1时,允许存储器进行地址对齐(指当访问一个字时,其地址必须是偶数;当访问双字时,其地址必须是4的倍数
50、)检查,若发现地址未对齐,则将产生异常中断。oVIF(virtual interrupt flag)表示虚拟中断标志。当VIF=1时,可以使用虚拟中断;当VIF=0时,不能使用虚拟中断。oVIP(virtual interrupt pending flag)表示虚拟中断挂起标志。当VIP=1时,VIF有效;当VIP=0时,VIF无效。oID(identification flag)表示鉴别标志。该标志用来指示Pentium CPU是否支持CPUID的指令。o8086的16位寻址方式同样适用于32位x86CPU,只不过是将立即数、寄存器、存储器有效地址扩充到了32位,而且8个32位通用寄存器都可