《基本指令系统》PPT课件.ppt_第1页
《基本指令系统》PPT课件.ppt_第2页
《基本指令系统》PPT课件.ppt_第3页
《基本指令系统》PPT课件.ppt_第4页
《基本指令系统》PPT课件.ppt_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 8086基本指令系统,8086全部指令按功能可分成六大类:数据传送指令、算术运算指令、逻辑指令、串操作指令、控制转移指令和处理机控制指令。本章主要介绍以下内容: 数据传送指令 算术运算指令 位操作指令 字符串操作指令 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、指令。,3.1 数据传送指令,一、基本的传送指令MOV(Move) 格式: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 注:对段寄存器赋值时,只能通过寄存器赋值,不能用立即数直 接赋值。,允许的操作数组合:,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指令传送示意图,(6)通用寄存器到除CS外的段寄存器 如:MOVDS,AX ;。(7)段寄存器到通用寄存器 如:MOVAX,DS ; (8)存储器到除CS外的段寄存器 如:MOVES,2000H;(9)段寄存器到存储器 如:MOV2000H,DS;,二、交换指令 XCHG (Exc

5、hange) 格式: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两单元的内容互换,三、查表换码指令 XLAT (Translate) 格式:XLAT;AL(BX+AL) 表:256字节的数据区。 BX BX指向表的首地址

6、AL 指向数据表某项地址(0255)。 执行XLAT时,将BX+AL指向字节单元中的值送AL。 该指令操作数全为隐含,换码表首地址在BX中,欲读取数据表单元偏移量在AL中。,例: MOV BX,1000H MOV AL,04H XLAT ;AL(BX+AL)=(1004H)=50H 换码过程:,3.1.3 堆栈操作指令 堆栈及堆栈操作指令(1)堆栈的概念 堆栈是内存的一个逻辑段,当这个段被指定为堆栈后,可用堆栈操作指令对它进行特殊规则的访问,这个规则就是: 不论入栈还是出栈,都只能从栈顶处进行,堆栈内数据遵循先进后出,后进先出的原则。(2)堆栈的设置 8086/8088中专门有2个寄存器用于堆

7、栈操作:堆栈段寄存器SS和堆栈指针寄存器SP。 SS用来存放堆栈段的段基址,SP用于指示堆栈的顶部单元的段内偏移量,开始时堆栈内没有数据,栈顶就是栈底,故开始时要将栈底单元的偏移量赋给它,以指明栈低位置。,3.1 数据传送指令,二、堆栈操作指令 堆栈按“后进先出” 原则设计的数据区。 堆栈段地址由SS段寄存器提供 堆栈区操作数据地址由堆栈指针寄存器SP提供。 SP的初值是指向的地址为栈底,进行堆栈数据操作后SP指向栈顶地址。必须为字操作数 1入栈指令PUSH (Push onto the stack) 格式:PUSH SRC ;SPSP-2,(SP+1,SP)(SRC) 8088的入栈过程:

8、(1) SPSP-1,调整堆栈指针,指向一个空地址(新栈顶) (2)(SP)(SRCH),源操作数高字节送SP指向的单元; (3)SPSP-1,调整堆栈指针,指向一个空地址SP; (4)(SP)(SRCL),源操作数低字节送SP指向的单元。,8086的入栈过程: (1) SPSP-2,调整堆栈指针,指向一个空地址; (2) (SP)(SRC),源操作数(字)送SP指向的单元。 例1: PUSH AX PUSH BX,2.出栈指令POP(Pop from the stack) 格式:POP DEST ;(DEST)(SP+1,SP),SPSP+2 ;或(DEST)(SP) , SPSP+2 80

9、88的出栈过程 (1)(DESTL)(SP),源操作数低字节(SP)送目的; (2) SPSP+1,调整堆栈指针SP; (3)(DESTH)(SP),源操作数高字节(SP)送目的; (4) SPSP+1,再调整堆栈指针SP 。 8086的出栈操作 (1) (DEST)(SP),源字操作数(SP)送目的; (2) SPSP+2,调整堆栈指针SP。,例2 :将例1堆栈内容,仍弹出给AX、BX。 POP BX POP AX 例3 :将例1堆栈内容,弹出给BX、AX, 交换出栈。 POP AX POP BX,3.1 数据传送指令,3.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位) 该指令的两个操作数均是隐含的,源操作数为AH寄存器,目的操作数为标

11、志寄存器的低字节。,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 (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为482,3.1 数据传送指令,二、将地址指针装到DS和目的寄存器 LDS (Load DS with pointer) 格式: LDS reg16,mem32;reg16 (mem32),DS (mem32+

13、2) 功能把指向mem32开始的四个地址单元内容, 高字(段地址)传送到DS中, 低字(偏移量)送目的寄存器(reg16)。,例1:设2130H-2133H四个单元中,存放着一个地址,2131H、2130H中存地址的偏移量为2211H,2133H、2132H中存段地址值为4433H,执行指令: LDS DI,2130H; DI2211H,DS4433H。,三、将地址指针装到ES和另一个寄存器LES(Load ES with pointer) 格式:LES reg16,mem32;reg16(mem32), ;ES (mem32+2) 功能把指向mem32开始的四个地址单元内容, 高字(段地址)

14、传送到ES中, 低字(偏移量)送目的寄存器(reg16)。 例2:条件同例1 LES DI,2130H; DI2211H,ES4433H。,3.1.6 输入/输出指令 8086/8088 CPU由于采用独立编址方式,因此必须使用专门的输入/输出指令。这类指令利用累加器AL或AX和外设接口中的端口以字节或字为单位进行信息的传输。由于专门用到了累加器,所以又称累加器专用传送指令。共包括两条指令:IN和OUT。,3.1 数据传送指令,由于8086/8088 CPU外设最多可以有65536个端口,端口号为0000H0FFFFH,因此源操作数有两种格式:当端口号为00H0FFH时(即前256个端口),端

15、口号以立即数的形式直接在指令中指定,这就是长格式中的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,(DX) 短格式字操作,2)OUT输出指令,格式: OUT PORT,AL 长格式字节操作 OUT PORT,A

16、X 长格式字操作 OUT DX,AL 短格式字节操作 OUT DX,AX 短格式字操作 执行操作:(AL)(PORT) 长格式字节操作 (AX)(PORT+1,PORT) 长格式字操作 (AL)(DX) 短格式字节操作 (AX)(DX)+1,(DX) 短格式字操作,算术运算指令负责执行加、减、乘、除四则基本运算。它包括无符号数、有符号数的二进制算术运算和十进制算术运算调整指令,它们中有双操作数指令,也有单操作数指令。,3.2 算术运算指令,3.2.1 加法指令 1.不带进位位的加法指令 ADD (Add) 格式:ADD DEST,SRC ;DEST(DEST)+(SRC) 例: ADD AL,

17、90H ; ADD BX,23OOH ; ADD SI,CX ; ADD BX+DI,AX ; ADD AX,BX+3000H ;,3.2 算术运算指令,2.带进位位的加法指令ADC(Add with the carry) 格式:ADC DEST,SRC ;DEST(DEST)+(SRC)+CF ADC与ADD指令的区别, 是加进位标志CF。 例: ADC AX,DI ;AX AXDICF ADC BX,SI ;BX(SI)+BX+CF ADC BX,1OOOH ;BX BX+ 1OOOH+CF ADC AL,53 ;AL AL+ 53+CF,例:两个4字节的无符号数,分别放在2000H和21

18、00H开始的存储单元中,低位在前,高位在后,两数相加运算后,和放在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中 ADC AX,DI+2 ;两个数的高l6位连同进位位相加 MOV SI+2,AX ;高16位相加的结果送到2002H,2003

19、H单元,3增量指令INC (Increment) 格式:INC DEST ;DEST(DEST)+1 用于循环程序中修改指针和循环次数。 例: INC CL ;将CL中的内容加1 INC BX ;将BX中的内容加1 INCBYTEPTRBX+SI+1500,3.2.2 减法指令 1不带借位的减法指令 SUB (Subtract) 格式:SUB DEST,SRC ;DEST(DEST)(SRC) 例: SUB AX,CX SUB BP+4,CL SUB AX,60 SUB SI,3010H SUB BYTE PTRDI,1OH 2. 带借位的减法指令 SBB (Subtract with bor

20、row) 格式:SBB DEST,SRC ;DEST(DEST)(SRC)CF 例:SBB BX,1840H SBB WORD PTR SI+2,2OOOH,3.减量指令 DEC (Decrement) 格式:DEC DEST ;DEST(DEST)1 例: DEC AX DEC BYTE PTR DI+5 4.取补指令 NEG (Negate) 格式:NEG DEST ;DEST0-(DEST) 例: MOV AL,01110011B NEG AL ;AL10001101B MOV BX,1111000011110000B NEG BX ;BX0000111100010000B,5.比较指令

21、CMP (Compare) 格式:CMP DEST,SRC;FLAGS(DEST)(SRC) CMP执行两个数的相减操作, 只影响标志寄存器(AF,CF,OF,SF,PF和ZF),不影响DEST。 CMP后面要有一个条件转移指令,判断状态。,例:CMP AX,1000H ;将AX的内容和1000H相减,影响标志位 CMP AX,BX+DI+100 ;将AX的值和字存储单元(BX+DI+100) ;数相比较,影响标志位,3.2.3 乘法指令 1.无符号数乘法MUL(unsigned multiple) 格式:MUL SRC ; 两字节相乘 :AXAL*(SRC) 两字相乘: (DX,AX)AX*

22、(SRC),2. 带符号数乘法IMUL(signed multiple) 格式:IMUL SRC ; 两字节相乘 :AXAL*(SRC),结果带符号 两字相乘 :(DX,AX)AX*(SRC),带符号,3.2.4 除法指令 1. 无符号数除法DIV (unsigned divide) 格式:DIV SRC ; 168位:ALAX/(SRC)(商),AHAX/(SRC)(余数) 3216位:AX(DX,AX)/(SRC)(商), DX(DX,AX)/(SRC)(余数) 2有符号数除法IDIV (signed divide) 格式:IDIV SRC ;操作与DIV相同,但结果带符号。,3.2.5

23、符号扩展指令 1. 字节转换为字CBW (Convert byte into word) 格式:CBW ;将AL中的符号扩展到AH中。 例:MOV AL,10011010B CBW ;AX1111111110011010B 2.字转换为双字CWD (Convert word into double word) 格式:CWD ;将AX中的符号扩展到DX中。,3.2.6 十进制调整指令 BCD(binary-coded decimal)是一种二进制的数字编码形式,是用二进制编码的十进制数,又称二进码十进数。它利用了4个二进制位来储存一个十进制的数码,由于常用的BCD码中从左到右每一位的1分别表示8

24、、4、2、1,所以这种代码又称8421BCD码。 在IBM-PC中,表示十进制数的BCD码有压缩BCD码和非压缩BCD码两种格式。所谓压缩BCD码格式(packed BCD format),指的是用4位二进制数表示一位BCD码,用一个字节表示的两位BCD码。非压缩型BCD码格式(unpacked BCD format)是指一个字节可存放一个一位十进制数,其中高4位的内容不做规定(也有部分书籍要求为0,二者均可),低4位二进制数表示该位十进制数,,1.压缩BCD码加法累加器调整指令DAA(Decimal Adjust for Addition),格式:DAA ;对AL的值调整为正确的压缩BCD码

25、。执行DAA前两个压缩型BCD码相加的结果已存于AL中。DAA调整的过程: 若 (AL高四位清零,低四位不变 2.逻辑或OR(or) 格式:OR DEST,SRC ;DEST(DEST)(SRC) 应用:或指令可以使一个操作数在其它位不变的情况下,将某些位置1.要保持不变的位应与0相或,要置1的位应与1相或。 例:OR AL,02H;将D1位置置1,其他位不变。 3.逻辑非NOT(not) 格式:NOT DEST ;DEST ( DEST),4.逻辑异或XOR (exclusive or),格式:XOR DEST,SRC;(DEST)(DEST)(SRC ) 异或指令可以使一个操作数在其它位不

26、变的情况下, 将某些位取反。要保持不变的位应与0相异或,要取 反的位应与1相异或。 常用在一些程序的开头使某个寄存器清0,以配合初始化工作的完成。 例:XOR AX ,AX ;使累加器AX清0,CF=0。,5.测试指令TEST(test),格式:TEST DEST,SRC ;FLAGS(DEST)(SRC ) TEST指令一般用来检测指定位是1还是0,而这个指定位往往对应一个物理量。例如某一个状态寄存器的最低位反映一种状态,为1时说明信号满足要求,设某状态位连接到寄存器的D0位,检测时可以先将状态寄存器的内容读到AL中,再用TEST AL,01指令,此后就可以通过对ZF的判断来了解此状态位是否

27、为1。如果ZF=1,说明结果为0,即状态位为0,条件不满足,如果ZF=0说明结果不为0 ,即状态位不为0,而为1,所以条件满足,3.3.2 移位指令,移位指令,可8位/16位操作数(OPRD)移1位或移CL位。 1.非循环移位指令 (1) 算术左移指令 SAL(Shift Arithmetic Left) 格式1:SAL OPRD,1;左移1位,最高位移入CF,最低位移入0 格式2:SAL OPRD,CL;左移CL位,最高位移入CF,最低位移入0 (2)逻辑左移指令 SHL(Shift Logic Left) 格式1:SHL OPRD,1;同SAL 格式2:SHL OPRD,CL;同SAL,(

28、3)算术右移指令 SAR(Shift Arithmetic Right) 格式1:SAR OPRD,1;右移1位,最低位移入CF,最高位右移同时再填入最高位 格式2:SAR OPRD,CL;右移CL位,最低位移入CF,最高位右移同时再填入最高位,(4)逻辑右移指令 SHR(Shift Logic Right) 格式1:SHR OPRD,1; 右移1位,最低位移入CF,最高位移入0 格式2:SHR OPRD,CL;右移CL位,最低位移入CF,最高位移入0,2.循环移位指令 (1)不带进位位的循环左移指令 ROL(Rotate Left) 格式1:ROL OPRD,1 ;OPRD左移1位,最高位移

29、入CF, 同时移回最低位 格式2:ROL OPRD,CL;OPRD左移CL位,每次移位,最高位移入CF,同时移回最低位 (2)不带进位位的循环右移指令 ROR(Rotate Right) 格式1:ROR OPRD,1 ;OPRD右移1位,最低位移入CF,同时移回最高位 格式2:ROR OPRD,CL;OPRD右移CL位, 每次移位,最低位移入CF,同时移回最高位,(3)带进位位的循环左移指令 RCL(Rotate through CF Left) 格式1:RCL OPRD,1;OPRD左移1位,最高位移入CF, 原CF位移回最低位 格式2:RCL OPRD,CL;OPRD左移CL位,每次移位,

30、 最高位移入CF,原CF位移回最低位 (4)带进位位的循环右移指令 RCR(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,针对数据块或字符串的操作; 可实现存储器到存储器的数据传送; 待操作的数据串称为源串,目标地址称为目标串。,串操作指令的特点,源串一般存放在数据段,偏移地址由SI指定。允许段

31、重设; 目标串必须在附加段,偏移地址由DI指定; 指令自动修改地址指针,修改方向由DF决定。DF=0 增地址方向;DF=1 减地址方向; 数据块长度值由CX指定 可增加自动重复前缀以实现自动修改CX内容。,串操作指令流程,取源串地址,取目标串地址,设串长度,传送一个字节或字,修改地址指针,修改串长度值,传送完否?,串传送MOVS(move string),把字节或字操作数从主存的源地址传送至目的地址,MOVSB;字节串传送:ES:DIDS:SI, ;SISI1,DIDI1,MOVSW;字串传送:ES:DIDS:SI, ;SISI2,DIDI2,指令应用程序,功能演示,MOVSB字节串正向传送,

32、主存,地址低端,地址高端,30H,源操作数 DS:SI,目的操作数 ES:DI,DF0,正向传送,(SI)=(SI)+1,(DI)=(DI)+1,31H,30H,31H,MOVSB字节串反向传送,主存,地址低端,地址高端,30H,源操作数 DS:SI,目的操作数 ES:DI,DF1,反向传送,返回,(SI)=(SI)-1,(DI)=(DI)-1,31H,32H,32H,31H,例:字节串传送,mov si,offset source mov di,offset destination mov cx,100;cx传送次数 cld ;设置DF=0,实现地址增加 again: movsb ;传送一个

33、字节(可否用movsw) dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,转移again位置执行 ;否则,结束,该段程序的功能是将数据段中由source指示的100个字节数据,传送到附加段由destination指示的主存区。,例:字串传送,mov si,offset source mov di,offset destination mov cx,50;cx传送次数 cld;设置DF=0,实现地址增加 again:movsw;传送一个字(用movsb) dec cx;传送次数减1 jnz again;判断传送次数cx是否为0 ;不为0(ZF=0),则转移

34、again位置执行; ;否则,结束,串存储STOS(store string),把AL或AX数据传送至目的地址,STOSB;字节串存储:ES:DIAL, ;DIDI1,STOSW;字串存储:ES:DIAX, ;DIDI2,指令应用程序,例:串存储,mov ax,0 mov di,0 mov cx,8000h ;cx传送次数(321024) cld;DF=0,地址增加 again:stosw;传送一个字 dec cx;传送次数减1 jnz again;判断传送次数cx是否为0,程序段功能是什么?可以将CLD改为STD吗 可不用给DI赋值吗如何改用STOSB,串读取LODS(load string

35、),把指定主存单元的数据传送给AL或AX,LODSB;字节串读取:ALDS:SI, ;SISI1,LODSW;字串读取:AXDS:SI, ;SISI2,指令应用程序,例:串读取(上段:准备),mov si,offset block mov di,offset dplus mov bx,offset dminus mov ax,ds mov es,ax ;所有数据都在一个段中,所以设置es=ds mov cx,count;cx字节数 cld,例3.6.5:串读取(下段:判断),go_on:lodsb;从block取出一个数据 test al,80h;检测符号位,判断是正是负 jnz minus;

36、符号位为1,是负数,转向minus stosb;符号位为0,是正数,存入dplus jmp again;程序转移到again处继续执行 minus:xchg bx,di stosb;把负数存入dminus xchg bx,di again:dec cx;字节数减1 jnz go_on;完成正负数据分离, 该段程序的功能是什么?,解释, 该段程序的功能是什么? 数据段DS中有一个数据块,具有count个字节,起始地址为block。 现在要把其中的正数、负数分开,分别存入同一个段的两个缓冲区。 存放正数的起始地址为dplus,存放负数的起始地址为dminus。,串比较CMPS(compare st

37、ring),将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系。,CMPSB;字节串比较:DS:SIES:DI ;SISI1,DIDI1,CMPSW;字串比较:DS:SIES:DI, ;SISI2,DIDI2,指令应用程序,例:比较字符串是否相同,mov si,offset string1 mov di,offset string2 mov cx,count cld again:cmpsb;比较两个字符 jnz unmat;有不同字符,转移到unmat dec cx jnz again;进行下一个字符的比较 mov al,0;字符串相等,设置00h标记 jmp out

38、put;转向output unmat:mov al,0ffh;设置ffh标记 output:mov result,al;输出结果标记,串扫描SCAS(scan string),将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系。,SCASB;字节串扫描:ALES:DI, ;DIDI1,SCASW;字串扫描:AXES:DI, ;DIDI2,指令应用程序,例:查找字符串中的空格,mov di,offset string mov al,20h mov cx,count cld again:scasb;搜索 jz found;为0(ZF=1),发现空格 dec cx;不是

39、空格 jnz again;搜索下一个字符 .;不含空格,则继续执行 found:.,重复前缀指令(repeat),串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但在串操作指令前,可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中。 重复前缀分2类,3条指令: 配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀 配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀,REP重复前缀指令,REP前缀可以理解为: 当数据串没有结束(CX0),则继续传送,REP;每执行一次串指令,CX减1 ;直到CX0,重复执行结束,例3.6.8:串传送,mov s

40、i,offset source mov di,offset destination mov cx,100;cx传送次数 cld rep movsb,again:movsb;传送一个字节 dec cx;传送次数减1 jnz again;判断传送次数cx是否为0 ;不为0(ZF=0),则转移again位置执行; ;否则,结束,REPZ/REPNZ重复前缀指令,REPZ/REPE当数据串没有结束(CX0),并且串相等(ZF1),则继续比较。 REPNZ/REPNE当数据串没有结束(CX0),并且串不相等(ZF0),则继续比较。,REPZ;每执行一次串指令,CX减1 ;并判断ZF是否为0, ;只要CX

41、0或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工作在保护模式下时,它的所有功能都是可用的。,3)虚拟8086模式 为了在保护模式下继续提供和8086处理器的兼容,80386又设计了一种虚拟

42、8086模式,以便可以在保护模式的多任务条件下,有的任务运行32位程序,有的任务运行MS-DOS程序。,3.5.2 32位CPU寄存器组和寻址方式的变化,80386微处理器共有7类34个寄存器,包括通用寄存器组、段寄存器、指令指针和标志寄存器、系统地址寄存器、控制寄存器、调试寄存器、测试寄存器。通常应用程序主要使用前3类,标志寄存器EFLAGS,标志寄存器EFLAGS,由8086的FLAGS寄存器扩展而来,低12位与8086的标志寄存器FLAGS的低12位含义完全相同,其他各标志位的含义如下:,IOPL(I/O privilege level)占两个二进制位,表示I/O特权级。如果当前特权级小

43、于或等于IOPL,就可以执行I/O操作,否则将出现一个保护性异常。IOPL只能由特权级为0的程序或任务来修改。 NT(nested task)表示嵌套任务,用于控制中断返回指令IRET。当NT=0时,用堆栈中保存的值恢复EFLAGS、CS和EIP,从而实现返回;若NT=1,则通过任务切换实现中断返回。,VM(virtual-8086 mode)表示虚拟8086模式。如果VM被置位且80386已处于保护模式下,则CPU切换到虚拟8086模式,此时,对段的任何操作又回到了实模式,如同在8086下运行一样。 RF(resume flag)表示恢复标志(又称重启标志),与调试寄存器一起用于断点和单步操

44、作。当RF=1时,下一条指令的任何调试故障将被忽略,不产生异常中断;当RF=0时,调试故障被接受,并产生异常中断(常用于调试失败后,强迫程序恢复执行,在成功执行每条指令后,RF自动复位)。,AC(alignment check)表示对齐检查(只有运行在特权级3的程序才执行地址对齐检查,特权级0、1、2忽略该标志)。当AC=1且CR0中的AM=1时,允许存储器进行地址对齐(指当访问一个字时,其地址必须是偶数;当访问双字时,其地址必须是4的倍数)检查,若发现地址未对齐,则将产生异常中断。 VIF(virtual interrupt flag)表示虚拟中断标志。当VIF=1时,可以使用虚拟中断;当V

45、IF=0时,不能使用虚拟中断。,VIP(virtual interrupt pending flag)表示虚拟中断挂起标志。当VIP=1时,VIF有效;当VIP=0时,VIF无效。 ID(identification flag)表示鉴别标志。该标志用来指示Pentium CPU是否支持CPUID的指令。,8086的16位寻址方式同样适用于32位x86CPU,只不过是将立即数、寄存器、存储器有效地址扩充到了32位,而且8个32位通用寄存器都可以当做基址寄存器,除了ESP外的另外7个通用寄存器都可以当做变址寄存器使用。除此之外,Intel 32位CPU还提供3种带比例因子、仅适用于32位CPU的寻

46、址方式:比例变址寻址、基址比例变址寻址和相对基址比例变址寻址。,比例因子可以是1、2、4或8。默认比例因子是1,不要求包含在汇编语言指令中。比例因子2用来寻址字存储器数组,比例因子4用来寻址双字存储器数组,而比例因子8用来寻址四字存储器数组。,32位存储器寻址方式的组成公式可总结为为: 32位有效地址= 基址寄存器(变址寄存器比例)位移量 其中的3个组成部分是: (1)基址寄存器任何8个32位通用寄存器之一。 (2)变址寄存器除ESP之外的任何32位通用寄存器之一。 (3)比例可以是1248(因为操作数的长度可以是1248字节)。,3.5.3 32位扩展增强指令,1)数据传送类指令 主要包括如

47、下一些指令: (1)PUSH i8/i16/i32 该指令把16位或32位立即数i16i32压入堆栈。若是8位立即数i8,则经符号扩展成16位后再压入堆栈。 (2)由于32位x86CPU新增了FS和GS段寄存器,所以可对它们进行堆栈操作。 (3)PUSHA顺序压入AX,CX,DX,BX,SP(指令执前),BP,SI,DI;POPA栈顶的16个字节依次出栈到DI,SI,BP,SP,BX,DX,CX,AX,其中应进入SP的值丢弃,SP通过加16来恢复,(4)PUSHAD顺序压入EAX,ECX,EDX,EBX,ESP(指令执前),EBP,ESI,EDI;POPAD栈顶的32个字节依次出栈到EDI,E

48、SI,EBP,ESP,EBX,EDX,ECX,EAX,其中应进入ESP的值丢弃,SP通过加32来恢复 (5)PUSHFD将EFLAGS压入堆栈,堆栈中标志位VM和RF被清0;POPFD 将EFLAGS弹出堆栈,其中VIP和VIF被清0, VM不改变 (6)新增LFS、LGS、LSS3条地址传送指令,功能与原LDS、LES指令类似。,2)算术运算指令,(1)有符号数乘法又提供了新形式: 双操作数格式:双操作数格式中,乘积存储在第一个操作数中,第一个操作数必须是寄存器,第二个操作数可以是寄存器、内存操作数或立即数。 IMUL r16,r16/m16/i8/i16 ;r16r16r16/m16/i8

49、/i16 IMUL r32,r32/m32/i8/i32 ;r32r32r32/m32/i8/i32 三操作数格式:三操作数格式中,乘积存储在第一个操作数。 IMUL r16,r16/m16,i8/i16 ;r16r16/m16i8/i16 IMUL r32,r32/m32,i8/i32 ;r32r32/m32i8/i32 如果有效位丢失,则溢出标志和进位标志置位。使用三操作数格式时,一定要在执行完IMUL操作后检查相关操作位。,(2)新增6条符号扩展指令:,CWDE ;把AX符号扩展为EAX,该指令是CBW的扩展 CDQ ;把EAX符号扩展为EDX:EAX,该指令是CWD的扩展 MOVSXr

50、16,r8/m8 ;把r8/m8符号扩展并传送至r16 MOVSX r32,r8/m8/r16/m16 ;把r8/m8/r16/m16符号扩展并传送至r32 MOVZX r16,r8/m8 ;把r8/m8零位扩展并传送至r16 MOVZX r32,r8/m8/r16/m16 ;把r8/m8/r16/m16零位扩展并传送至r32,3)位操作类指令,移位和循环移位指令从80186开始,可以用一个立即数指定移位次数。但是,实际的移位次数等于指令中指定移位次数的低5位,所以为031。,4)串操作指令,新增串输入INS和串输出OUTS指令。 INS I/O串输入: 存储单元ES:(E)DII/O端口DX

51、 (E)DI(E)DI1/2/4 OUTS I/O串输出: I/O端口DX存储单元DS:(E)SI ;(E)SI(E)SI1/2/4 其中,DF=0时,地址自增;DF=1时,地址自减。1为字节串;2为字串;4为双字串。,5)控制转移类指令,为了更好地支持高级语言,引入3条新指令: (1)建立堆栈帧指令ENTER: ENTER i16,i8 分配一个堆栈帧,目的操作数是一个16位常数(取值0FFFFH), 表示堆栈空间的字节数;源操作数是一个8位常数(取值031), 表示允许过程嵌套的层数,(2)释放堆栈帧指令LEAVE: LEAVE 撤销ENTER指令所设置的堆栈空间,一般在过程返回指令之前 (3)边界检测指令BOUND: BOUND r16/r32,m16/m32 检查寄存器的内容是否满足关系式(存储器地址)(寄存器)(存储器地址+2),如果不能满足则产生一个5号中断; 若满足关系式,则指令不作任何操作,3.5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论