收藏 分享(赏)

微机原理与接口技术--指令系统.ppt

上传人:weiwoduzun 文档编号:5376482 上传时间:2019-02-25 格式:PPT 页数:109 大小:608KB
下载 相关 举报
微机原理与接口技术--指令系统.ppt_第1页
第1页 / 共109页
微机原理与接口技术--指令系统.ppt_第2页
第2页 / 共109页
微机原理与接口技术--指令系统.ppt_第3页
第3页 / 共109页
微机原理与接口技术--指令系统.ppt_第4页
第4页 / 共109页
微机原理与接口技术--指令系统.ppt_第5页
第5页 / 共109页
点击查看更多>>
资源描述

1、2019/2/25,1,微机原理与接口技术,第三章 指令系统,2019/2/25,2,第一节 指令的基本结构和执行时间,指令 指令系统 80868088CPU的指令系统共包含92种基本指令,按照功能可将它们分为6大类: 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 控制转移指令 处理器控制指令,2019/2/25,3,8086指令的一般格式如下:操作码 操作数,操作数操作数主要分为3类:立即数操作数、寄存器操作数存储器操作数。,2019/2/25,4,表3-2 隐含及允许超越的段寄存器 存储器操作的类型 隐含的段寄存器 允许超越的段寄存器 偏移地址 取指令 CS 无 IP 堆栈操

2、作 SS 无 SP 通用数据读写 DS CS,ES,SS 有效地址 源数据串 DS CS,ES,SS SI 目标数据串 ES 无 DI 用BP作为基址寄存器 SS CS,DS,ES 有效地址,2019/2/25,5,指令的执行时间 一条指令的执行时间包括取指令、取操作数、执行指令及传送结果几部分,单位用时钟周期表示 寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢,2019/2/25,6,第二节 8086的寻址方式,一、立即寻址(Immediate Addressing) 主要用于给寄存器或存储单元赋初值 MOV AX,3508H,2019/2/25,7,二、直

3、接寻址(Direct Addressing) 直接寻址指令在指令的操作码后面直接给出操作数的16位偏移地址。 此偏移地址也称为有效地址EA(Effective Address),与指令的操作码一起,存放在内存的代码段. 低8位存放在低地址单元,高8位存放在高地址单元。,2019/2/25,8,直接寻址: MOV AX,3200H 如果DS=5000H,则所寻找的操作数的物理地址: 5000H10H+3200H=50000H+3200H=53200H,2019/2/25,9,段超越 : MOV BX,ES:2100H,2019/2/25,10,三、寄存器寻址(Register Addressin

4、g) 操作数为CPU的内部寄存器 指令在执行过程中不必通过访问内存而取得操作数,因此执行速度很快。 MOV DS,AX,2019/2/25,11,四、寄存器间接寻址(Register Indirect Addressing) MOV AX,DI 指令中的16位寄存器的内容不是操作数,而是操作数的偏移地址,操作数本身则在存储器中。 可用的寄存器有四个,分别是:SI、DI、BX和BP,但如果使用不同的间址寄存器,则相应的段寄存器有所不同,2019/2/25,12,1选择SI、DI、BX作为间址寄存器 操作数在数据段(没有使用段超越时) MOV AX,DI 若已知(DS)=5000H,(DI)=16

5、00H,则操作数的物理地址为:5000H10H+1600H=51600H 执行的结果为(AX)=789AH,2019/2/25,13,2选择BP作为间址寄存器 操作数在堆栈段(没有使用段超越时) MOV BP,AX 若已知(SS)=6000H,(BP)=1500H,则操作数的物理地址为:6000H10H+1500H=61500H 若已知(AX)=5566H,则指令的执行结果为:66H送到61500H内存单元,55H送到61501H内存单元,2019/2/25,14,无论用SI、DI、BX或BP作为间址寄存器,都允许段超越。MOV ES:DI,AXMOV DX,DS:BP,2019/2/25,1

6、5,五、变址寻址(Indexed Addressing) 以指定的寄存器内容,加上指令中给出的8位或16位位移量(必须要以一个段寄存器作为基地址),作为操作数的地址。 作为变址寻址的寄存器可以是SI、DI、BX、BP四个寄存器中的任一个,若用SI、DI和BX作为变址寄存器,操作数在数据段,即段地址在DS寄存器;若用BP变址,则操作数在堆栈段,即段地址在SS寄存器 MOV AX,2000HSI 若(SI)=1200H,(DS)=1500H,则操作数的地址为18200H,2019/2/25,16,变址寻址方式,2019/2/25,17,六、基址变址寻址(Based Indexed Addressi

7、ng) 将BX和BP看作基址寄存器,将SI和DI看作变址寄存器。 基址加变址的寻址方式: 把一个基址寄存器(BX或BP)的内容加上一个变址寄存器(SI或DI)的内容,再加上指令中指定的8位或16位位移量(必须要以一个段寄存器作为地址基址),作为操作数的地址 MOV AX,1050HBXSI,2019/2/25,18,MOV AX,1050HBXSI 若(BX)=2000H,(SI)=1600H,(DS)=1200H,指令中给出的偏移量为1050H,则源操作数的物理地址为16650H 若用BX作为基址寄存器,则段寄存器为DS,操作数在数据段中; 若用BP作为基址寄存器,则段寄存器为SS,操作数在

8、堆栈段中。,2019/2/25,19,基址加变址的寻址方式,2019/2/25,20,第三节 8086的指令系统, 数据传送(Data transfer) 算术运算(Arithmetic) 逻辑运算和移位(Logic) 串操作(String manipulation) 控制转移(Control transfer) 处理器控制(Processor control),2019/2/25,21,OPRD 泛指各种类型的操作数 mem 存储器操作数 acc 累加器操作数 dest 目的操作数 src 源操作数 disp 8位或16位偏移量,可用符号地址表示 DATA 8位或16位立即数 port 输入

9、输出端口,可用数字或表达式表示 ( ) 表示寄存器的内容 表示存储单元的内容或偏移地址,2019/2/25,22,一、数据传送类指令,按功能可分为以下4小类:通用数据传送指令输入输出指令目标地址传送指令标志传送指令,2019/2/25,23,1. 通用数据传送指令(General Purpose Transfer)一般传送指令MOV堆栈操作指令PUSH和POP交换指令XCHG查表转移指令XLAT字位扩展指令,2019/2/25,24, 一般传送指令MOV (Movement) MOV dest,src ;(dest)(src)既可传送字节操作数(8位),也可传送字操作数(16位);可使用本章讨

10、论过的各种寻址方式;可实现以下各种传送:,2019/2/25,25,MOV可实现的各种传送:,寄存器与寄存器之间的传送: MOV AL,CL 寄存器与段寄存器之间的传送: MOV DS,AX 寄存器与存储器之间的传送: MOV 3000H,AX 立即数到寄存器的传送: MOV AL,20H 立即数到存储器的传送: MOV BYTE PTRBP+SI,20H 存储器与段寄存器之间的传送: MOV DS,2000H,2019/2/25,26,使用MOV指令完成数据传送时需注意几点:,MOV指令的两个操作数的类型必须相同 MOV AX,DL 不能用一条MOV指令完成两个存储器单元之间的数据传送 MO

11、V BX,SI 不能用立即数直接给段寄存器赋值MOV DS,DATA 不能在段寄存器之间进行直接数据传送 MOV DS,ES 通常不要求用户用MOV指令修改代码段寄存器CS和指令指针寄存器IP的内容,但CS可以作为源操作数,2019/2/25,27, 堆栈操作指令PUSH和POP (Push word onto stack, Pop word off stack)堆栈是内存中一个特定的区域,用以存放寄存器或存储器中暂时不用但又必须保存的数据。,2019/2/25,28,堆栈操作需要遵循以下原则:,堆栈的存取每次必须是一个字(16位);向堆栈中存放数据时,总是从高地址向低地址方向增长,从堆栈取数

12、据时正好相反;堆栈指令中的操作数只能是寄存器或存储器操作数,而不能是立即数;堆栈段在内存中的位置由SS决定,堆栈指针SP总是指向栈顶,即SP的内容等于当前栈顶的偏移地址。在压入操作数之前,SP先减2。每弹出一个字,SP加2;对堆栈的操作遵循“后进先出(LIFO: Last In First Out)”的原则。最后压人堆栈的数据会最先被弹出。,2019/2/25,29,堆栈示意图,2019/2/25,30,堆栈操作指令PUSH,POP,PUSH src ;src的高8位(SP)-1;src的低8位(SP)-2;(SP)-2(SP) POP dest ;SPdest的低8位;SP+1dest的高8

13、位;(SP)+2(SP),2019/2/25,31,指令中,操作数src和dest可以是以下三种类型:寄存器(包括数据寄存器、地址寄存器和变址寄存器);段寄存器(CS除外。PUSH CS指令是合法的;而POP CS是非法的);存储器单元,2019/2/25,32,PUSH AX指令执行示意图,2019/2/25,33,POP AX指令执行示意图,2019/2/25,34,交换指令XCHG (Exchange),指令格式及操作:XCHG dest,src ;(dest) (src)源操作数和目标操作数均可以是寄存器或存储器,但不能同时为存储器。即可以在寄存器与寄存器之间、寄存器与存储器之间进行交

14、换,但不能在存储器与存储器之间进行交换。不能为段寄存器操作数。即段寄存器的内容不能参加交换。两个操作数的字长必须相同,可以是字节交换,也可以是字交换。,2019/2/25,35,查表转移指令XLAT (Translate),指令格式与操作:XLAT ;(AL)(BX)+(AL)或:XLAT src_table (src_table表示要查找的表的首地址) 可以根据表中元素的序号查出表中相应元素的内容 应预先将要查找的这类代码排成一个表存放在内存的某个区域中。 将表的首地址(偏移地址)送BX寄存器,要查找的元素的序号送AL,表中第一个元素的序号为0,然后依次为1,2,3,。 执行XLAT指令后,

15、标中指定序号的元素存于AL,2019/2/25,36,例:,现要查出数值6对应的ASCII码 LEA BX,Hex_table ;(BX)表的首地址 MOV AL,6 ;(AL)6XLAT ;查表转换 结果为(AL)=36H,为6所对应的ASCII码。,2019/2/25,37,字位扩展指令,操作数扩展的规则是:扩展时在高位添加符号位,即将符号位扩展到整个高8位(或高16位)。 例如,要把有符号数35H扩展为一个字,则结果为0035H;而如果要扩展的数是81H,则结果为FF81H。,2019/2/25,38,CBW (Convert Byte to Word),CBW ;若(AL)80H,则(

16、AH)=00H;否则(AH)=FFH。 CBW将一个字节的数(8位)扩展为一个字长的数(16位)。指令中隐含了操作数AL和AH。CBW指令不影响标志位。例如,把字节9AH扩展为字的语句如下:MOV AL,9AHCBW 其结果为:(AX)=FF9AH。,2019/2/25,39,CWD (Convert Word to Double word),CWD ;若(AX)8000H,则(DX)=0000H;否则(DX)=FFFFH。 CWD将一个字操作数(16位)扩展为一个双字(32位)。指令中隐含了操作数AX和DX,扩展后的高16位放在DX中。CWD指令也不影响标志位。 例如,把字25ABH扩展为双

17、字的语句如下:MOV AX,25ABHCWD 其结果为:(DX:AX)=000025ABH,2019/2/25,40,输入输出指令(Input and Output),输入指令IN用于从外设端口接收数据,输出指令OUT向外设端口发送数据。无论接收到的数据或准备发送的数据,都必须在累加器AX(字)或AL(字节)中 直接寻址方式:当I/O端口地址为8位二进制时,在指令中直接给出此端口地址。它允许寻址256个端口,端口地址为0FFH。 DX寄存器间接寻址方式:当I/O端口地址为16位二进制时,用DX寄存器间接寻址。它可寻址64K个端口,端口地址为0FFFFH。,2019/2/25,41,输入指令IN

18、 (Input byte or word)IN acc,port ;port为8位立即数表示的端 口地址,直接寻址 或 IN acc,DX ;DX给出16位端口地址,间接寻址 输出指令OUT (Output byte or word) OUT port,acc ;port为8位立即数表示的端口地址,直接寻址 或OUT DX,acc ;DX给出16位端口地址,间接寻址,2019/2/25,42,例 将一个字节3BH输出到端口地址78A0H,MOV AL,3BH ;将要输出的字节送入累加器AL MOV DX,78A0H ;将16位端口地址送入DX进行间址 OUT DX,AL ;将AL中的一个字节输

19、出到DX所指定的16位端口地址,2019/2/25,43,目标地址传送指令(Address-Object Transfer),取偏移地址指令LEA(Load Effective Address)LEA reg16,mem 指令指令中的源操作数必须为存储器操作数,目标操作数必须为16位通用寄存器,指令的执行结果是把源操作数的有效地址(即16位偏移地址)送到目标寄存器。 例如:LEA BX,BUFFER,2019/2/25,44,注意LEA指令和MOV指令的区别:LEA BX,BUFFER MOV BX,BUFFER 以下两条指令的效果相同:LEA BX,BUFFERMOV BX,OFFSET B

20、UFFER,2019/2/25,45,LDS(Load pointer using DS)LDS reg16,mem32 ;(reg16)(mem32)+1:(mem32);(DS)(mem32)+3:(mem32)+2) 指令中源操作数mem32为存储器操作数,目标操作数为16位通用寄存器。 LDS指令把存储器mem32中存放的一个32位远地址指针(包括偏移地址和段地址)送到reg16和DS。 四个存储单元的前两个单元的内容作为偏移地址送到reg16,后两个单元的内容作为段地址送到段寄存器DS。,2019/2/25,46,例,设(DS)=6000,内存地址为60348H开始的4个单元中存放了

21、一个32位的远地址指针98011H。LDS SI,0348H MOV AX,SI 上述第一条指令执行后的结果为:(SI)=8011H,(DS)=9000H。 第二条指令的执行结果为:(AX)=3412H,2019/2/25,47,LES(Load pointer using ES) LES指令的格式及功能与LDS相似, 两个高地址单元中给出的段地址送ES。,2019/2/25,48,标志传送指令(Flag Register Transfer),LAHF(Load AH from Flags) 该指令将标志寄存器FLAGS中的五个标志位,即符号标志SF、零标志ZF、辅助进位标志AF、奇偶标志PF

22、以及进位标志CF分别传送到累加器AH的对应位。 LAHF指令不影响标志位。,2019/2/25,49,SAHF(Store AH into Flags) SAHF指令的传送方向与LAHF相反,将AH寄存器的第7、6、4、2、0位分别传送到标志寄存器的对应位。 SAHF指令影响标志位,FLAGS寄存器中的SF、ZF、AF、PF和CF将被修改成AH寄存器对应位的状态,但其余标志位不受影响。,2019/2/25,50,PUSHF(Push Flags onto stack) PUSHF指令是将标志寄存器FLAGS压入堆栈。指令本身不影响标志位。SP-1(FLAGSH)SP-2(FLAGSL)(SP)

23、(SP)-2 POPF(Pop Flags off stack) POPF指令将堆栈中当前栈顶的两个单元的内容弹出到标志寄存器FLAGS中。POPF指令影响标志位(FLAGSL)SP(FLAGSH)SP+1(SP)(SP)+2,2019/2/25,51,算术运算指令,8086/8088提供了加、减、乘、除4组基本的算术运算指令,既可以用于字节运算,也可以用于字运算;既可用于无符号数运算,也可用于带符号数运算。若是带符号数,用补码表示。8086/8088还提供了各类校正操作指令,可以进行十进制的算术运算。,2019/2/25,52,加法运算指令,不带进位的加法指令ADD 带进位的加法指令ADC

24、加1指令INC 两条加法调整指令:AAA和DAA。,2019/2/25,53,不带进位的加法指令ADD(Addition),ADD OPRD1,OPRD2 ;(OPRD1)(OPRD1)+(OPRD2) ADD加法指令影响标志位 源操作数和目标操作数可以是寄存器操作数或存储器操作数,源操作数还可以是立即数; 操作数可以是无符号数,也可以是带符号数。 需注意两点:一是源操作数与目标操作数不能同时为存储器操作数,二是不能对段寄存器进行运算,2019/2/25,54,带进位的加法指令ADC(Add with carry),ADC OPRD1,OPRD2 ;(OPRD1)(OPRD1)+(OPRD2)

25、+(CF) ADC指令与ADD指令在格式、功能及对标志位的影响等方面都类似,只是在ADC指令中,CF也要参加求和运算 ADC指令主要用于多字节数据的加法运算。如果低字节相加时产生进位,则在下一次高字节相加时应将此进位加进去,2019/2/25,55,加1指令INC(Increment by 1),INC OPRD ;(OPRD)(OPRD)+1 INC指令对指定的操作数加1,再送回到该操作数。在指令中,操作数OPRD可以是寄存器操作数,也可以是存储器操作数;可以是8位,也可以是16位。但不能是段寄存器,也不能是立即数 INC指令不影响CF标志位,但会影响其他5个状态标志位AF、OF、PF、SF

26、和ZF。INC指令通常用在循环程序中修改地址指针及循环次数等,2019/2/25,56,压缩BCD加法的十进制调整指令DAA (Decimal Adjust for Addition),所谓压缩的BCD码,是指一个字节中可以存放两位BCD码,高4位和低4位各存放一位。 一般来说,两个BCD码相加以后,有可能得到不正确的BCD结果,可用DAA指令对AL寄存器中的“和”进行调整,即可得到预期的结果。 DAA指令调整的方法是: 若(AL)中低4位9或AF=1,则(AL)+06H(AL),并使AF=1; 若(AL)中高4位9或CF=1,则(AL)+60H(AL),并使CF=1。,2019/2/25,5

27、7,例 编程用BCD数计算4635?,MOV AL,46H ;(AL)=46HADD AL,35H ;(AL)=7BHDAA ;(AL)=81H,2019/2/25,58,非压缩BCD加法的十进制调整指令AAA (unpacked BCDASCII Adjust for Addition),所谓非压缩的BCD码,就是一个字节存放一位BCD码(BCD码存放在字节的低4位,高4位为零)。调整以前,先用指令ADD或ADC进行8位数的加法运算,相加结果放在AL中,用AAA指令调整后,非压缩BCD码的低位在AL寄存器,高位在AH寄存器。 AAA指令的调整步骤为: 若(AL)中低4位9或AF=1,则(AL

28、)+6,(AH)+1,并使AF=1; 屏蔽掉(AL)中高4位,即(AL)(AL)0FH; CFAF,2019/2/25,59,例 用BCD码计算86?,MOV AL,08H ;BCD码数8MOV BL,06H ;BCD码数6ADD AL,BL ;(AL)=08H+06H=0EHAAA ;(AL)=0EH+06H=04H(高4位清零);(AH)=1;(CF)=1,2019/2/25,60,减法运算指令,不带进位减法指令SUB 带进位减法指令SBB 减1指令DEC 求补指令NEG 比较指令CMP 减法的ASCII调整指令AAS 减法十进制调整指令DAS,2019/2/25,61,不带进位减法指令S

29、UB(Subtraction)SUB OPRD1,OPRD2 ;(OPRD1)(OPRD1)-(OPRD2) 带进位减法指令SBB(Subtraction with Borrow)SBB OPRD1,OPRD2 ;(OPRD1)(OPRD1)-(OPRD2)-CF 减1指令DEC(Decrement by 1)DEC OPRD ;(OPRD)(OPRD)-1,2019/2/25,62,DEC指令常用在循环程序中修改循环次数。 例如:MOV CX,1000HNEXT: DEC CXJNZ NEXTHLT,2019/2/25,63,求补指令NEG(Negate)NEG OPRD ;(OPRD)0-

30、(OPRD) 求补指令对6个操作数均有影响。 操作数的类型可以是寄存器或存储器;可以对8位或16位数求补 利用NEG指令可以得到负数的绝对值,2019/2/25,64,比较指令CMP(Compare)CMP OPRD1,OPRD2 ;(OPRD1)-(OPRD2),结果不送回OPRD1 比较指令对6个状态标志位SF、ZF、AF、PF、CF和OF都有影响。 比较指令主要用来比较两个数的大小关系,2019/2/25,65,压缩BCD减法的十进制调整DAS(Decimal Adjust for Subtraction) 非压缩BCD减法的十进制调整AAS (unpacked BCDASCII adj

31、ust for subtraction),2019/2/25,66,乘法运算指令,无符号数乘法指令MUL 有符号数乘法指令IMUL 乘法的十进制调整指令AAM,2019/2/25,67,无符号数乘法指令MUL(Multiplication unsigned)MUL OPRD 指令的操作为:字节乘法: (AX)(OPRD)(AL)字乘法: (DX:AX)(OPRD)(AX) 源操作数OPRD可以是8位或16位的寄存器或存储器。另一个操作数隐含在累加器中(8位乘法时在AL中;16位乘法时在AX中)。 两个操作数均按无符号数处理,其取值范围为0255(字节),或065535(字)。 乘法指令要求两个

32、操作数必须等长,且不能是立即数,2019/2/25,68,有符号数乘法指令IMUL(Integer Multiplication) 操作数应满足带符号数的取值范围,即128127(字节)和3276832767(字) 乘法的十进制调整指令AAM(unpacked BCDASCII adjust for multiply),2019/2/25,69,除法运算指令,无符号数除法指令DIV 带符号数除法指令IDIV 除法的十进制调整指令AAD,2019/2/25,70,无符号数除法指令DIV(Division unsigned)DIV OPRD 指令中的操作数OPRD(除数)可以是8位或16位的寄存器

33、操作数或存储器操作数。指令隐含被除数AX(16位)或DX:AX(32位)。 字节除法:(AL)(AX)/(OPRD)(AH)(AX)%(OPRD) (%为取余数操作) 字除法:(AX)(DX:AX)/(OPRD)(DX)(DX:AX)%(OPRD) (%为取余数操作),2019/2/25,71,带符号数除法指令IDIV(Integer Division) IDIV指令在格式和功能上都与DIV指令类似,只是要求操作数为有符号数 除法的十进制调整指令AAD(unpacked BCDASCII adjust for division),2019/2/25,72,逻辑运算和移位指令,逻辑运算指令 AN

34、D(逻辑“与”) OR(逻辑“或”) NOT(逻辑“非”) XOR(逻辑“异或”) TEST(测试) 这些指令可对8位或16位的寄存器或存储器单元中的内容进行按位操作,2019/2/25,73,逻辑“与”指令AND(Logical and)AND OPRD1,OPRD2 ;(OPRD1)(OPRD1)(OPRD2) AND指令的主要用途是将目标操作数的某些位清零,而其他位保持不变 如果一个寄存器的内容与该寄存器本身相与(例如:AND AX,AX),则寄存器原来的内容不会改变,但将影响标志位SF、ZF和PF,并使CF=OF=0,2019/2/25,74,逻辑“或”指令OR(Logical inc

35、lusive or)OR OPRD1,OPRD2 ;(OPRD1)(OPRD1)(OPRD2) OR指令的主要用途是将目标操作数的某些位置1,而其他位保持不变,2019/2/25,75,逻辑“非”指令NOT(Logical not)NOT OPRD NOT指令将指定的操作数OPRD按位求反,再送回到该操作数 逻辑“异或”指令XOR(Logical not)XOR OPRD1,OPRD2 ;(OPRD1)(OPRD1)(OPRD2) XOR指令的一个用途是将寄存器清零,同时也将进位标志位CF清零。例如: XOR AX,AX,2019/2/25,76,测试指令TEST(Test or non-de

36、structive logical and) TEST指令的格式、操作及对操作数的要求和AND指令类似,但该指令“与”的结果不送回目标操作数,而只是影响标志位。 TEST指令常用于在不破坏原来操作数的情况下检测操作数中某些位是“1”还是“0”。 例如: TEST AL,80H TEST AX,4000H,2019/2/25,77,非循环移位指令,算术左移指令SAL(Shift arithmetic left) 算术右移指令SAR (Shift arithmetic right) 逻辑左移指令SHL(Shift logic left ) 逻辑右移指令SHR (Shift logic right)

37、 可以实现对8位或16位的寄存器或存储器操作数进行指定次数的移位。 在要求进行2位或更多位的移动时,移位的次数必须放在CL寄存器中。,2019/2/25,78,算术左移和逻辑左移指令SAL/SHL 算术左移指令SAL和逻辑左移指令SHL执行完全相同的操作:SAL OPRD,1 SHL OPRD,1 或 SAL OPRD,CL SHL OPRD,CLSAL指令和SHL指令的区别是:SAL指令将操作数视为有符号数,而SHL将操作数视为无符号数,2019/2/25,79,例3-8 一个16位无符号数存放在以DATA为首地址的两个连续的单元,用左移指令实现将该数乘以乘以10。,LEA SI,DATA

38、;DATA单元的偏移地址送SIMOV AX,SI ;(AX)被乘数SHL AX,1 ;(AX)DATA*2MOV BX,AX ;暂存于BXMOV CL,2 ;(CL)移位次数SHL AX,CL ;(AX)DATA*8ADD AX,BX ;(AX)DATA*10HLT ;停止,2019/2/25,80,逻辑右移指令SHR 将目标操作数顺序向右移1位或CL指定的位数 例:SHR BH,1SHR AX,CL,算术右移指令SAR 将目标操作数顺序向右移1位或CL指定的位数 例:SAR AL,1SAR BX,CL,2019/2/25,81,循环移位指令,不带进位标志位CF的循环左移指令ROL(Rotat

39、e left) 不带进位标志位CF的循环右移指令ROR(Rotate right) 带进位标志位CF的循环左移指令RCL(Rotate left through carry) 带进位标志位CF的循环右移指令RCR(Rotate right through carry) 所有循环移位指令都只影响进位标志CF和溢出标志OF, 而对其他标志位没有影响,2019/2/25,82,不带进位标志位CF的循环左移指令ROL ROL OPRD,1 或 ROL OPRD,CL,不带进位标志位CF的循环右移指令ROR ROR OPRD,1 或 ROR OPRD,CL,2019/2/25,83,带进位标志位CF的循

40、环左移指令RCL RCL OPRD,1 或 RCL OPRD,CL,带进位标志位CF的循环右移指令RCR RCR OPRD,1 或 RCR OPRD,CL,2019/2/25,84,串操作指令,串操作指令具有以下的共同特点 : 源串指针为DS:SI。源串(源操作数)默认为数据段,即段基地址在DS中,但允许超越。偏移地址用SI寄存器指定。 目标串指针为ES:DI。目标串(目标操作数)默认在ES附加段中,不允许段超越。偏移地址用DI寄存器指定。 使用重复前缀时,要操作的串长度放在CX寄存器中。 自动修改指针和计数器。在对每个字节(或字)操作后,SI和DI寄存器的内容会根据方向标志DF的情况自动修改

41、:若(DF)=0,则每次操作后,SI和DI按地址增量方向修改(对字节操作加1;对字操作加2);若(DF)=1,则SI和DI按地址减量方向修改。若使用了重复前缀,CX的内容也会每次自动减1。,2019/2/25,85,用于串操作的重复前缀 : REP: 无条件重复前缀 重复执行指令规定的操作,直到(CX)0; REPE: 相等时重复 ZF1,且(CX)0时重复; REPZ: 结果为零时重复 ZF1,且(CX)0时重复; REPNE: 不相等时重复 ZF0,且(CX)0时重复; REPNZ: 结果不为零时重复 ZF0,且(CX)0时重复,2019/2/25,86,串传送指令MOVS (Move s

42、tring) 指令格式有3种:MOVS OPRD1,OPRD2MOVSBMOVSW 第二种和第三种格式隐含了两个操作数的地址,此时源串和目标串地址必须符合默认值,即源串在DS段,偏移地址在SI中,而目标串在ES段,偏移地址在DI中,2019/2/25,87,例 将3000H:1500H地址开始的100个字节传送到6000H:1000H开始的内存单元中去,MOV AX,3000HMOV DS,AX ;设定源串段地址MOV AX,6000HMOV ES,AX ;设定目标串段地址MOV SI,1500H ;设定源串偏移地址MOV DI,1000H ;设定目标串偏移地址MOV CX,100 ;串长度送

43、CXCLD ;(DF)0,使地址指针按增量方向修改NEXT:REP MOVSB,2019/2/25,88,串比较指令CMPS (Compare string) 指令有3种格式:CMPS OPRD1,OPRD2CMPSBCMPSW 串比较指令通常和条件重复前缀REPE(REPZ)或REPNE(REPNZ)连用,用来检查两个字符串是否相等。,2019/2/25,89,例3-10 现有两个长度均为100个字节的字符串,STRING1为源串首地址,STRING2为目标串首地址。试比较两个字符串是否相同,并找出其中第一个不相等的字符,将源串中该字符的地址送BX,该字符送AL。,LEA SI,STRING

44、1 ;(SI)源串首地址LEA DI,STRING2 ;(DI)目标串首地址MOV CX,100 ;(CX)串长度CLD ;(DF)0,使地址指针按增量方向修改REPE CMPSB ;若相等则重复比较JCXZ STOP ;若(CX)0,则转STOPDEC SI ;否则(SI)-1,指向不相等的单元MOV BX,SI ;(BX)不相等单元的地址MOV AL,SI ;(AL)不相等单元的内容 STOP: HLT ;停止,2019/2/25,90,串扫描指令SCAS (Scan string) 指令格式有3种:SCAS OPRD ;OPRD为目的串SCASBSCASW SCAS指令执行时,将累加器A

45、L或AX的值与目的串(由ES:DI所指向)中的字节或字进行比较,比较结果不改变目的操作数,只影响标志位 SCAS指令常用于在一个字符串中搜索特定的关键字,把要找的关键字放在AL(或AX)中,再用本指令与字符串中各字符逐一进行比较,2019/2/25,91,例3-11 有一个包含100个字符的字符串,其首地址为STRING。找出字符串中第一个回车符CR(其ASCII码为ODH),找到后将其地址保存在BX,LEA DI,STRING ;(DI)字符串首地址MOV AL,0DH ;(AL)回车符CRMOV CX,100 ;(CX)字符串长度CLD ;清标志位DFREPNE SCASB ;若未找到,重

46、复扫描JZ FOUND ;若找到,则转FOUNDJMP STOP ;转移至STOP FOUND: DEC DI ;(DI)-1MOV BX,DI ;地址送到BX STOP: HLT ;停止,2019/2/25,92,串装入指令LODS (Load string) 指令格式有3种:LODS OPRD ;OPRD为源串LODSBLODSW LODS指令把由DS:SI指向的源串中的字节或字取到累加器AL或AX中,并在这之后根据DF的值自动修改指针SI,以指向下一个要装入的字节或字。,2019/2/25,93,例3-12 在以BUFFER为首地址的内存区域中,有10个以非压缩BCD码形式存放的十进制数

47、,它们的值可能是09中的任意一个。将这些十进制数顺序显示在屏幕上。在屏幕上显示一个字符的方法,是使用DOS系统功能调用,这样只需要三条语句即可: 02HAH; 待显示字符的ASCII码DL; INT 21H。,2019/2/25,94,LEA SI,BUFFER ;(SI)源串首地址 MOV CX,10 ;(CX)字符串长度CLD ;清标志位DFMOV AH,02H ;(AH)功能号 NEXT: LODSB ;取一个BCD码到ALADD AL,30H ;BCD码转换为 ASCII码MOV DL,AL ;(DL)待显示字符的ASCII码INT 21H ;显示DEC CX ;(CX)(CX)-1JNZ NEXT ;(CX)0则重复HLT ;停止,2019/2/25,95,串存储指令STOS (Store string) 指令格式有3种:STOS OPRD ;OPRD为目标串STOSBSTOSW STOS指令把累加器AL中的字节或AX中的字存到由ES:DI指向的存储器单元中,并在这之后根据DF的值自动修改指针DI的值(增量或减量),以指向下一个存储单元。利用重复前缀REP,可对连续的存储单元存入相同的值,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 计算机原理

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报