收藏 分享(赏)

汇编语言程序设计及上机指导-第4章-指令系统.ppt

上传人:无敌 文档编号:1378626 上传时间:2018-07-07 格式:PPT 页数:90 大小:4.59MB
下载 相关 举报
汇编语言程序设计及上机指导-第4章-指令系统.ppt_第1页
第1页 / 共90页
汇编语言程序设计及上机指导-第4章-指令系统.ppt_第2页
第2页 / 共90页
汇编语言程序设计及上机指导-第4章-指令系统.ppt_第3页
第3页 / 共90页
汇编语言程序设计及上机指导-第4章-指令系统.ppt_第4页
第4页 / 共90页
汇编语言程序设计及上机指导-第4章-指令系统.ppt_第5页
第5页 / 共90页
点击查看更多>>
资源描述

1、第4章 指令系统,【本章提要】 本章重点讲述IA-32系列CPU的常用指令,和支持EM64T技术的高级Pentium4以及Core系列CPU的Intel64指令系统。 【学习目标】 熟练掌握汇编语言各种指令的功能和操作数在内存的存放规 律 掌握各种指令对操作数和寻址方式的特殊要求,明确不同指 令对标志寄存器的具体影响等方面 熟悉CPU内部各寄存器的使用规则及其在指令执行过程中的 隐含约定,2018年7月7日星期六,指令系统是CPU所能执行的各种指令的集合,定义了计算机硬件所能完成的基本操作,不同的CPU有不同的指令系统。8086/8088CPU的指令系统是基本指令集,80X86、Pentium

2、X以及Core2系列的指令系统保留了基本指令集,又进行了扩充。,4.1 指令系统概述,2018年7月7日星期六,8086/8088指令系统是基本指令集,指令的操作数宽度是8位或16位,偏移地址宽度是16位。IA-32扩充指令和系统控制指令的操作数宽度可以是8位、16位或32位,偏移地址宽度一般是32位。64位方式指令的操作数可以是8位、16位、32位或64位,操作数的偏移地址可以是16位、32位或64位。指令系统大体可以分成7个功能组:数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理器控制和其他类。,2018年7月7日星期六,2018年7月7日星期六,4.2 数据传送类指令

3、,通用数据传送堆栈操作地址传送标志位传送I/O数据传送传送类指令执行后对标志位都没有影响(除SAHF、 POPF和POPFD外)。,4.2.1 通用数据传送指令,2018年7月7日星期六,(1)MOV指令,指令格式:MOV OPRD1,OPRD2功能:将源操作数传送给目标操作数【例】 MOV AL,BH ;通用寄存器之间传送字节数据 MOV DS,AX ;通用寄存器与段寄存器(CS不能是目标)之间传送数据 MOV EAX,12345678H ;立即数传送到通用寄存器 MOV RAX,BUFFER ;通用寄存器与存储器之间64位数据传送 MOV DATBP+DI,ES ;段寄存器与存储器之间传送

4、数据,2018年7月7日星期六,MOV指令操作数要求,注意:立即数和段寄存器CS不能作为目标操作数;立即数不能直接传送到段寄存器;两个存储单元之间不能直接传送数据;两个段寄存器之间不能直接传送数据;两个操作数宽度必须一致 。,2018年7月7日星期六,(2)交换指令XCHG,指令格式:XCHGOPRD1,OPRD2功能:将OPRD1与OPRD2进行交换。二者都是源操作数也都是目的操作数。操作数可以是寄存器或内存数变量。【例】 MOVEAX,12345678H ;EAX12345678H MOVEBX,56781234H ;EBX56781234H XCHGEAX,EBX ; 交换后,EAX56

5、781234H, EBX12345678H XCHG R8,100 ;R8寄存器内容与内存100号地址 中的64位数据交换 注意: 不能在两个存储单元之间直接交换数据; 段寄存器和立即数不能作为操作数。,2018年7月7日星期六,(3)查表转换指令XLAT,指令格式:XLAT 功能:完成一个字节的查表转换,将数据段中偏移地址为BX/ebx/RBX与AL寄存器之和的存储单元的内容送入AL寄存器,即:BX+ALAL。例:若(BX)=0100H,(AL)=05H,执行XLAT指令后,(AL)=2CH。注意:由于AL只有8位,所以表的长度不能超过256字节。,2018年7月7日星期六,(4)字节交换指

6、令BSWAP,是80486新增的指令指令格式:BSWAPreg32功能:将32位通用寄存器中的双字以字节为单位进行高、低字节交换,改变双字数据的存放方式。 指令执行时, 字节0(b0b7)与字节3(b24b31)交换, 字节1(b8b15)与字节2(b16b23)交换。,2018年7月7日星期六,4.2.2 堆栈操作指令,(1)PUSH/POP 堆栈是内存的一个数据区,是按照先进后出原则组织的一段内存区域,段寄存器SS指向段基址,堆栈指针SP始终指向堆栈的顶部。 PUSH REG16/REG32/REG64/MEM16/MEM32/MEM64 POP REG16/REG32/REG64/MEM

7、16/MEM32/MEM64,2018年7月7日星期六,PUSH指令:SP-NSP; 16/32/64位的源操作数压入堆栈 源操作数可以是通用寄存器、段寄存器和存储器,N为源操作数的字节数2或4或8 。POP指令:从栈顶弹出操作数到目标操作数; SP+NSP 目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。,PUSH/POP指令,2018年7月7日星期六,(2)PUSH/PUSHA/POPA,是80286新增的指令指令格式:PUSH imm16 PUSHA POPA指令功能: PUSH imm16将字立即数压入堆栈,如果给出的数 不够16位,它会在自动扩展后压入堆栈; PUSHA指令

8、将所有通用寄存器的内容压入堆栈,压 入的顺序是:AX、CX、DX、BX、SP、BP、SI、DI; POPA指令将栈顶内容弹出,顺序与压入的相反(弹出 到SP的值被丢弃)。,2018年7月7日星期六,(3)PUSHAD/POPAD,386新增指令 PUSHAD指令将所有扩展通用寄存器的内容压入堆栈,压入的顺序是:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI;POPAD弹出的顺序与PUSHAD压入的相反(弹出到ESP的值被丢弃)。注意:在64位模式下,入栈和出栈指令的操作数只能是16位或64位,不支持32位操作数。,2018年7月7日星期六,4.2.3 地址传送指令,(1)有效地

9、址传送指令LEA指令格式:LEA REG16/REG32/REG64,MEM 功能:将源操作数在当前段内的有效地址(即地址偏移量)传送至目标操作数。区别:MOV指令传送操作数的内容,而LEA传送的是操作数的地址。MOV DI,LISTS ;将变量LISTS的内容传送至DI,DI=1234HLEA DX,LISTS ;将变量LISTS的偏移地址传送至DX,DX=2000HLEA AX,3000H ;将3000H单元的偏移地址传送至AX,AX=3000HLEA ESI,LISTS ;将变量LISTS的32位偏移地址传送至ESI, ESI=00002000HLEA RDX,LISTS ;将变量LIS

10、TS的64位有效地址传送至RDXLEA EDX,RAX ;将RAX的64位地址的低32位(即EAX的值) 传送至EDXLEA SI,RAX ;将RAX的64位地址的低16位(即AX的值)传送至SI,2018年7月7日星期六,(2)地址指针传送指令LDS和LES,指令格式:LDSREG16/REG32,MEM LESREG16/REG32,MEM指令功能:都是将由源操作数偏移地址决定的双字(或三字)单元中的第一个(或前两个)字的内容送入指令指定的16位(或32位)通用寄存器,第二个(或第三个)字的内容传送给段寄存器DS或ES,这两个段寄存器是隐含的目的操作数。TAB1 DF 123456789A

11、BCH ;定义TAB1为6个字节数据TAB2 DD 56781234H ;定义TAB2为4个字节数据LDS BX,TAB1 ;将9ABCHBX,5678HDSLES SI,TAB2 ;将1234HSI,5678HESLES EAX,TAB1 ;将56789ABCHEAX,1234HES只适用于16位或32位地址模式,在64位地址下不能使用,2018年7月7日星期六,3)地址指针传送指令LFS、LGS和LSS,386新增指令指令功能:与上述的LDS功能基本一样,不同的是将第二个(或第三个)字的内容分别传送给隐含的段寄存器FS、GS和SS。注意:在16位模式下,偏移地址为16位,上述各指令的目的寄

12、存器用16位的;在32位保护模式下,偏移地址为32位,上述各传送指令的目的寄存器应该是32位的。但段寄存器总是16位的。,2018年7月7日星期六,4.2.4 标志位传送指令,(1)标志寄存器读写指令LAHF/SAHF指令LAHF用于将标志寄存器的低字节(含SF、ZF、AF、PF和CF)读出后传送到AH寄存器。 不影响标志位指令SAHF与LAHF的操作相反,它把寄存器AH中的内容写入标志寄存器的低字节,取代某些标志位(SF、ZF、AF、PF和CF)的原来状态。,2018年7月7日星期六,2)标志寄存器入栈出栈指令,PUSHF指令的执行过程同PUSH指令,只是将标志寄存器FLAG的内容压入堆栈。

13、POPF则将当前栈顶的一个字传送给标志寄存器,同时修改SP+2SP。PUSHFD/POPFD指令是386新增的指令,功能与PUSHF/POPF基本相同,但操作为EFLAG与堆栈之间的传送。 PUSHFQ指令和POPFQ指令是64位指令,用于RFLAGS与堆栈之间的64位传送,只能用于64位地址方式。,2018年7月7日星期六,4.2.5 输入/输出数据传送指令,(1)简单输入输出指令IN/OUT指令格式:IN AL/AX,IMM8/DX OUT IMM8/DX,AL/AX 指令功能:专门用于在AL或AX寄存器与I/O端口之间传送数据 例:IN AX,30H ;从端口30H输入16位数到AXMO

14、V DX,300HIN AL,DX ;从端口300H输入8位数到ALOUT 60H,AL ;将8位数从AL输出到端口60HOUT DX,AX ;将16位数从AX输出到DX指定的端口在80386以后的32位CPU中,还可以通过EAX对I/O端口进行双字数据操作。在64位系统中,使用方法和16位/32位方式下相同。,2018年7月7日星期六,(2)字符串输入指令INS,指令形式:INSB :从DX指定的端口输入一个字节到ES:DI指定的 内存单元中去。INSW:从DX指定的端口输入一个字到ES:DI指定的内 存单元中去。 INSD:从DX指定的端口输入双字到ES:DI指定的内存 单元中去。 注意:

15、若方向标志DF=0,则DI中的地址自动+1(输入字节)或+2(输入字) 或+4(输入双字);若方向标志DF=1,则DI中的地址自动-1(输入字节)或 -2(输入字) 或-4(输入双字)。在64位方式下目标地址偏移量由EDI或RDI指明,指令功能和用法不变,2018年7月7日星期六,(3) 字符串输出指令OUTS,OUTSB:从DS:SI指定的内存单元输出 一个字节到DX指定的端口中去。OUTSW:从DS:SI指定的内存单元址 输出一个字到DX指定的端口中去。OUTSD:从DS:SI指定的内存单元输出 双字到DX指定的端口中去。方向标志DF的用法同INS指令,2018年7月7日星期六,4.3 算

16、术运算类指令,加法减法乘法,除扩展指令外,指令的执行结果都影响状态标志位,除法扩展十进制调整,2018年7月7日星期六,一加减法类指令,(1)加减法指令ADD/SUB指令格式: ADD reg / mem,reg/ mem/ imm SUB reg / mem,reg/ mem/ imm 功能: ADD完成两个操作数的加运算,结果送入第一个操作数; SUB完成第一个操作数减去第二个操作数,差送回到第一个操作数。,【例】 设AX65A0H,BX=B79EH,指令ADD BX,AX的执行情况如下:,BX=1D3EH,CF=1,SF=0,OF=0,AF=0,PF=0,ZF=0。,2018年7月7日星

17、期六,(2)带进位、借位的加减法指令ADC/SBB,指令格式:ADCOPRD1,OPRD2 SBBOPRD1,OPRD2指令功能:常用于长度为两个字或两个字以上的操作数的运算,加法操作时在最低位加上进位位CF,或减法操作时减去借位位CF。例如:如果有一个64位数据已存放在EAX(高32位)和EBX(低32位)中,现要加上一个常数123456789ABCDEF0H,这时可用下面两条指令实现: ADD EBX, 9ABCDEF0H ADC EAX, 12345678H,2018年7月7日星期六,(3)增量和减量指令INC/DEC,指令格式: INC MEM/ REG DEC MEM/ REG功能:

18、是单操作数指令,完成对指定的操作数加1/减1(1是隐含的),然后返回此操作数。注意:指令执行的结果影响标志位AF、OF、PF、SF和ZF,而不影响进位标志CF。 例:INC CX ;CX寄存器中的内容加1 DEC WORD PTR EAX;把EAX指向的字存储单元内容减1在64位方式下,大多数INC/DEC指令都是可以使用的。但是单字节编码的INC/DEC指令因为与16个REX前缀代码相同,所以不能使用。,2018年7月7日星期六,(4)求补指令NEG,指令格式:NEGREG / MEM功能:用零减去操作数,再把结果送回操作数。该指令执行的效果是改变操作数的符号,将正数变成负数或将负数变成正数

19、,但绝对值不变,所以又称为取负指令。注意:NEG指令影响所有状态标志:若操作数不是0,则总是使CF=1,否则置0;若在字节操作时对-128、或在字操作时对-32768求补、或在32位操作时对-232求补则操作数没变化,但溢出标志OF=1。例:NEG EBX ;对EBX求补,即EBX 0-EBXNEG BYTE PTR SI ;对8位内存操作数求相反数NEG AL ;AL0ALADD AL,200 ;以上两条指令实现AL(200AL)的运算NEG RAX ;RAX0RAXNEG QWORD PTR EAX;对64位内存操作数求相反数,2018年7月7日星期六,(5)比较指令CMP,指令格式:CM

20、P OPRD1,OPRD2功能:将OPRD1OPRD2,运算结果不送回OPRD1,执行后不改变源操作数和目标操作数,仅仅影响标志位,其它方面和SUB指令相同。讨论:1)如果是两个无符号数比较,可根据CF来判断:若CF1,则OPRD1OPRD2。2)如果是两个有符号数比较,要根据SF和OF来判断: 若SFOF0,则OPRD1OPRD2; 若SFOF1,则OPRD1OPRD2。3)不管操作数有无符号,若ZF1则两者相等,否则不等.,2018年7月7日星期六,(6)交换加法指令XADD,指令格式:XADD REG /MEM,REG功能:首先将两个操作数的内容交换, 然后两个操作数的值相加,结果送入第

21、一个操作数。(7)比较并交换指令CMPXCHG 指令格式:CMPXCHG REG /MEM,REG 功能:将目标操作数与AL、AX或EAX的内容进行比较:如果相等则ZF=1,并将源操作数送入目标操作数;否则ZF=0,并将REG /MEM送到相应的累加器。 例如:CMPXCHG ECX, EDX 若ECXEAX,则ECXEDX,且ZF1; 否则,EAXECX,且ZF0。,2018年7月7日星期六,(8)8字节比较并交换指令CMPXCHG8B,指令格式:CMPXCHG8B MEM64 功能:将EDX(高32位):EAX(低32位)的值与内存单元MEM64中的64位数进行比较,若相等,则置ZF=1,

22、并将ECX:EBX的值传送到MEM64指定的内存地址;否则,置ZF=0,将MEM64的8字节内容传送到EDX:EAX。 该指令只影响ZF标志。,2018年7月7日星期六,二乘除法指令,(1)乘法指令MUL/IMUL指令格式:MUL REG/MEM IMUL REG/MEM 功能:分别用于实现无符号数的乘法和有符号数的乘法运算。 它们都只有一个源操作数,可以是寄存器或存储器, 而目标操作数隐含规定在累加器中。,2018年7月7日星期六,当乘积的高半部分(字节相乘时为AH、字相乘时为DX、双字相乘时为EDX、64位相乘时为RDX)不为0,则标志CF=OF=1,表示在AH(或DX、EDX、RDX)中

23、存有结果的有效数字;否则CF=OF=0,2018年7月7日星期六,(2)除法指令DIV/IDIV,指令格式:DIVREG /MEM IDIVREG /MEM 功能:分别用于无符号数的除法和带符号数的除法运算。 指令中对操作数的规定同乘法指令,除法指令执行后,所有的状态标志都不确定。,若商超过存放它的寄存器的容量(分别为8位、16位、32位或64位)则引起0型中断(即除法出错中断),商和余数的值不能确定。,2018年7月7日星期六,(3)有符号多操作数乘法指令,指令格式一: IMUL reg16,reg16/ mem16 /imm16/imm8 IMUL reg32,reg32/ mem32 /

24、imm32/imm8 IMUL reg64,reg64/reg32/mem64/imm32/imm8功能:用第一个操作数乘以第二个操作数,返回的积存放在操作数1指定的寄存器中。指令格式二: IMUL reg16,reg16/ mem16,imm16/ imm8 IMUL reg32,reg32/ mem32,imm32/ imm8 IMUL reg64,reg64/ mem64,imm32/ imm8功能:用第二个操作数乘以第三个操作数,返回的积存放在操作数1指定的寄存器中。两种形式中,对乘积都限制其长度与第一个操作数的要一致(为16位、32位或64位有符号数),如果溢出,则溢出部分丢掉,并置

25、CF=OF=1,否则CF=OF=0,其余标志位无定义。,2018年7月7日星期六,【例3.28】 IMUL BX,CX ;BXBXCX IMUL BX,100 ;BXBX100 IMUL AX,BX+DI,1342H ;AX1342HDS:BX+DIIMUL AX,BX,30 ;AX30BXIMUL EAX,EBX,123456H ;EAXEAXEBX123456HIMUL RAX,RBX,12345678H ;RAXRAXRBX12345678H,2018年7月7日星期六,三符号扩展指令,1基本符号扩展指令CBW/CWDE/CDQE指令格式:CBW CWDE CDQE功能:操作数隐含规定在累

26、加器中。 CBW将AL中的字节符号数的符号扩展到AX中; CWDE将AX中的字有符号数的符号扩展到EAX中; CDQE将EAX中的字有符号数的符号扩展到RAX中,只能在64位方式下使用。扩展规则如下:若AL80H,则AH0 若AL80H,则AH0FFH若AX8000H,则EAX高16位0 若AX8000H,则EAX高16位0FFFFH若EAX9或标志AF=1,则ALAL6AHAH1AF1CFAFALAL&0FH,2018年7月7日星期六,(2)压缩BCD码加减法调整指令DAA/DAS,指令格式:加法调整指令DAA 减法调整指令DAS功能:若(AL&0FH)9或AF=1,则ALAL6AF1若AL

27、9FH或CF=1,则ALAL60HCF1;,【例3.31】AL=65H(十进制数65的BCD码),BH=47H(十进制数47的BCD码),用下列指令可得到这两个数和的正确结果。SUB AL,BH ;ALALBH (AL的值为1EH)DAS ;将AL的内容调整为18H,2018年7月7日星期六,(3)非压缩BCD码乘除法调整指令AAM/AAD,指令格式:乘法调整指令AAM 除法调整指令AADAAM紧跟在MUL指令之后,能把在AX中的两个非压缩BCD数相乘的结果进行调整,得到正确的非压缩BCD的乘积(高位在AH中,低位在AL中)。调整操作为:AHAL/0AH;AH AL被0AH除的商ALAL0AH

28、;AL AL被0AH除的余数AAD指令用来在进行两个非压缩BCD数的除法运算之前,先调整AL和AH中的内容,再用二进制除法指令DIV相除。相除以后,以非压缩BCD数表示的商在AL中,而相应的余数在AH中。调整操作为:ALAH0AH+ALAH0,2018年7月7日星期六,4.4 逻辑运算与移位指令,(1)逻辑非指令NOT指令格式:NOT reg / mem 功能:将操作数按位取反送回。 例:NOT EAX ;若指令执行前(EAX)=66668888H, 则指令执行后(EAX)=99997777H。,一逻辑运算指令,2018年7月7日星期六,(2)逻辑与/或/异或指令,指令格式:AND/OR/XO

29、Rreg/mem, reg/imm/mem reg功能:执行按位逻辑“与”、“或”和“异或”操作,两个操作数宽度必须相等,执行结果存入第一个操作数中。AND实现逻辑“与”操作: 例: AND AL,0FH ;AL的高4位被屏蔽,低4位被析取OR实现逻辑“或”操作: 例: OR BX,0003H ;BX寄存器的第0位和第1位置1XOR实现逻辑“异或”操作: 例: XOR EBX,00000001H ;改变BX寄存器第0位的状态,2018年7月7日星期六,(3)测试指令TEST,指令格式:TESTreg/ mem,reg /mem /imm指令功能:与AND指令相同,但操作结果不送回目标操作数,即

30、两个操作数不变,只影响标志位。例:若要检测AL中的最低位是否为1,为1则转移,可使用以 下指令:TEST AL,01HJNZ THAT ;ZF0,则AL寄存器的第0位为1,转移到THATTHAT:,2018年7月7日星期六,二移位和循环移位指令,2018年7月7日星期六,(1)移位指令SHL/SAL/SHR/SAR,具体指令为:SHL/SAL/SHR/SARreg/ mem,1 /CL/imm8指令影响PF、SF、ZF、CF以及OF五个标志位,对AF的影响不确定。 CF:总是等于目标操作数最后移出的那一位。 OF:-如果移位计数值为1,且执行结果使目标操作数的符号位(最高位) 发生变化,则OF

31、=1,否则OF=0; -若移位计数值不为1,则OF状态不定。,2018年7月7日星期六,【例3.37】 若AL中存有8位有符号数,现需要将其乘以16(2的4次方),结果存入AX中,则可用以下指令完成:CBW ;将字节AL扩展到字AXSALAX,4(或SHL AX,4);AXAX16【例3.38】 下面的程序段可用来执行(RAX)*5/2的运算(假设运算过程中没有超出64位)。MOV RDX,RAX ;RAX暂存于RDXSAL RAX,2 ;RAX*4ADD RAX,RDX ;5倍RAXSAR RAX,1 ;RAX除以2,2018年7月7日星期六,(2)循环移位指令ROL/ROR/RCL/RCR

32、,具体指令为: ROL/ROR/RCL/RCR reg/mem ,1 /CL/imm8 若有一个8字节数,它们或是存放在两个寄存器中(如EAX和EDX中),或是存放在连续的内存单元中,则可用下面的指令来实现这个8字节数整个左移一位。 SAL EAX,1 或:SAL FIRST_DWORD,1 RCL EDX,1 RCL SECOND_DWORD,1,2018年7月7日星期六,4.5 串操作类指令,2018年7月7日星期六,1)约定以DS:SI寻址源串,以ES:DI寻址目标串,所以指令中不必显式指明操作数。其中源串的段寄存器DS可通过加段超越前缀而改变,但目标串的段寄存器ES不能超越。在32位处

33、理器中,也可以用ESI和EDI 做为源和目的串的变址寄存器。2)用方向标志规定串处理方向。若DF=0(用指令CLD设置),从低地址向高地址方向处理;若DF=1(用指令STD设置),则处理方向相反。3)源、目标两个指针SI和DI在每次操作后都将根据方向标志DF的值自动增量(DF=0时)或减量(DF=1时),以指向串中下一项。增量/减量的大小由操作串的长度决定:字节串时SI和DI加/减1,字串时加/减2,双字串时加/减4 ,4字串时加/减8 。4)加重复前缀时,必须用CX作为重复次数计数器,其中存有被处理数据串的字节个数或字个数。指令每执行一次,CX值减1,直至减为0结束。在32/64位处理器中,

34、也可以用ECX/ RCX做为串重复次数寄存器。,串操作指令共同点,2018年7月7日星期六,一重复前缀REP/REPE/REPNE/REPZ/REPNZ,重复前缀不能单独使用,只能加在串操作指令之前,用来控制其后的基本串操作指令是否重复。1)在MOVS、LODS、STOS指令前加上前缀指令REP后,就按下列步骤不断地重复: 若CX=0,则退出REP操作;否则: CXCX1 执行REP后面的数据串指令 重复2)将REPE/REPZ加在CMPS或SCAS指令之前时,上述重复执行步骤变为: 若CX=0或ZF=0,则停止重复过程。3)将REPNE/REPNZ加在CMPS或SCAS指令之前时,上述重复执

35、行步骤变为: 若CX=0或ZF=1,停止重复过程。,2018年7月7日星期六,二基本串操作指令,(1)串传送指令MOVS/MOVSB/MOVSW/MOVSD/MOVSQ指令格式:MOVSOPRD1,OPRD2MOVSB;字节串传送MOVSW;字串传送MOVSD ;双字串传送MOVSQ ;4字串传送功能:把DS:SI指定的源串中的一个字节或字,传送至由ES:DI指定的目标串。且根据方向标志DF自动地修改SI、DI,以指向串中的下一个元素。,2018年7月7日星期六,例:将数据段内起始地址在SOURCE(段内偏移地址)的一数据块传送到附加段地址在DEST的存储单元中去,可用下面的程序段来实现(假设

36、数据块长度=100字节):LEASI,SOURCELEADI,DESTMOVCX,50;设置循环操作次数100/2CLD;设置方向标志DF0GO_ON:MOVSWDECCXJNZGO_ON 若采用重复前缀,则上述程序简化为:LEASI,SOURCELEADI,DESTMOVCX,50;设置循环操作次数CLD;设置方向标志DF0REPMOVSW,2018年7月7日星期六,(2)串比较指令CMPS/CMPSB/CMPSW/CMPSD/CMPSQ,指令格式:CMPSOPRD1,OPRD2 CMPSB;字节串比较 CMPSW;字串比较 CMPSD;双字串比较 CMPSQ;4字串比较功能:将DS:SI指

37、定的源串中的元素减去由ES:DI指定的目标串中的相应元素,但两个存储单元中的内容不变,而是用标志位的变化表示比较结果,同时根据方向标志DF自动修改源和目标串指针SI、DI。若CMPS指令前加上前缀REPE/REPZ,则表示:当串未结尾(CX0)且串相等(ZF=1)时继续比较;如果CMPS用REPNE/REPNZ作前缀,则表示:当串未结尾(CX0)且串不相等(ZF=0)时继续比较。,2018年7月7日星期六,例:比较两个字符串是否有相同的元素,它们的首地址和目标地址分别为SRC和DST,字符串的长度为N个字节。 CLD ;DF=0,增量方向 LEA SI,SRC ;字符串首地址送DS:SI LE

38、A DI,ES:DST ;目标地址送ES:DI MOV CX,N ;字符串长度 REPNE CMPSB ;重复比较字符串JNZ NOT_FOUND ;无相同的元素,转NOT_FOUND,否则继续执行下条指令NOT_FOUND:若两个字符串没有相同的元素,则串比较指令一直重复执行,直至(CX)=0为止,并转入下一条条件转移指令JNZ,判断比较结果是否为0。显然,由于未找到相同的元素,因此比较结果非0,转NOT_FOUND执行。,2018年7月7日星期六,(3)串搜索指令SCAS/SCASB/SCASW/SCASD/SCASQ,指令格式:SCASOPRD SCASB;搜索字节串 SCASW ;搜索

39、字串 SCASD;搜索双字串 SCASQ;搜索4字串功能:将累加器(AL或AX )中的内容与ES:DI )指定的目标串元素(字节或字或双字或4字)进行比较(减法操作),用标志位反映比较的结果,而不改变累加器和目标串的内容,达到字符串搜索的目的,同时自动修改指针DI。在SCAS指令前加有REPE/REPZ前缀,则表示:当串未结尾(CX0)且串元素关键值(ZF=1)时继续搜索。 用来搜索与给定关键值不同的内容。在SCAS指令前加有REPNE/REPNZ前缀,则表示:当串未结尾(CX0)且串元素关键值(ZF=0)时继续搜索,直到CX=0或ZF1才执行下一条指令。可以用来在一个串中查出某一指定元素。,2018年7月7日星期六,例:在首地址为ES:DST的字符串中检查是否有字符M,字符串的长度为N个字节。 CLD ;DF=0,增量方向 LEA DI,ES:DST ;目标地址送ES:DI MOV CX,N ;字符串长度 MOV AL,M ;搜索字符送AL REPNE SCASB ;重复搜索字符串是否有字符M若字符串中没有字符M,则串扫描指令一直重复执行,直至CX=0为止,并转入下一条指令继续执行。否则,将提前转入下一条指令继续执行。,

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

当前位置:首页 > 企业管理 > 经营企划

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


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

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

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