欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

    • 资源ID:6475885       资源大小:1.18MB        全文页数:90页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    第4章 指令系统,【本章提要】本章重点讲述IA-32系列CPU的常用指令,和支持EM64T技术的高级Pentium4以及Core系列CPU的Intel64指令系统。【学习目标】熟练掌握汇编语言各种指令的功能和操作数在内存的存放规 律 掌握各种指令对操作数和寻址方式的特殊要求,明确不同指 令对标志寄存器的具体影响等方面 熟悉CPU内部各寄存器的使用规则及其在指令执行过程中的 隐含约定,2023/11/3,指令系统是CPU所能执行的各种指令的集合,定义了计算机硬件所能完成的基本操作,不同的CPU有不同的指令系统。8086/8088CPU的指令系统是基本指令集,80X86、PentiumX以及Core2系列的指令系统保留了基本指令集,又进行了扩充。,4.1 指令系统概述,2023/11/3,8086/8088指令系统是基本指令集,指令的操作数宽度是8位或16位,偏移地址宽度是16位。IA-32扩充指令和系统控制指令的操作数宽度可以是8位、16位或32位,偏移地址宽度一般是32位。64位方式指令的操作数可以是8位、16位、32位或64位,操作数的偏移地址可以是16位、32位或64位。指令系统大体可以分成7个功能组:数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理器控制和其他类。,2023/11/3,2023/11/3,4.2 数据传送类指令,通用数据传送堆栈操作地址传送标志位传送I/O数据传送传送类指令执行后对标志位都没有影响(除SAHF、POPF和POPFD外)。,4.2.1 通用数据传送指令,2023/11/3,(1)MOV指令,指令格式:MOV OPRD1,OPRD2功能:将源操作数传送给目标操作数【例】MOV AL,BH;通用寄存器之间传送字节数据 MOV DS,AX;通用寄存器与段寄存器(CS不能是目标)之间传送数据 MOV EAX,12345678H;立即数传送到通用寄存器 MOV RAX,BUFFER;通用寄存器与存储器之间64位数据传送 MOV DATBP+DI,ES;段寄存器与存储器之间传送数据,2023/11/3,MOV指令操作数要求,注意:立即数和段寄存器CS不能作为目标操作数;立即数不能直接传送到段寄存器;两个存储单元之间不能直接传送数据;两个段寄存器之间不能直接传送数据;两个操作数宽度必须一致。,2023/11/3,(2)交换指令XCHG,指令格式:XCHGOPRD1,OPRD2功能:将OPRD1与OPRD2进行交换。二者都是源操作数也都是目的操作数。操作数可以是寄存器或内存数变量。【例】MOVEAX,12345678H;EAX12345678H MOVEBX,56781234H;EBX56781234H XCHGEAX,EBX;交换后,EAX56781234H,EBX12345678H XCHG R8,100;R8寄存器内容与内存100号地址 中的64位数据交换 注意:不能在两个存储单元之间直接交换数据;段寄存器和立即数不能作为操作数。,2023/11/3,(3)查表转换指令XLAT,指令格式:XLAT 功能:完成一个字节的查表转换,将数据段中偏移地址为BX/ebx/RBX与AL寄存器之和的存储单元的内容送入AL寄存器,即:BX+ALAL。例:若(BX)=0100H,(AL)=05H,执行XLAT指令后,(AL)=2CH。注意:由于AL只有8位,所以表的长度不能超过256字节。,2023/11/3,(4)字节交换指令BSWAP,是80486新增的指令指令格式:BSWAPreg32功能:将32位通用寄存器中的双字以字节为单位进行高、低字节交换,改变双字数据的存放方式。指令执行时,字节0(b0b7)与字节3(b24b31)交换,字节1(b8b15)与字节2(b16b23)交换。,2023/11/3,4.2.2 堆栈操作指令,(1)PUSH/POP 堆栈是内存的一个数据区,是按照先进后出原则组织的一段内存区域,段寄存器SS指向段基址,堆栈指针SP始终指向堆栈的顶部。PUSH REG16/REG32/REG64/MEM16/MEM32/MEM64 POP REG16/REG32/REG64/MEM16/MEM32/MEM64,2023/11/3,PUSH指令:SP-NSP;16/32/64位的源操作数压入堆栈 源操作数可以是通用寄存器、段寄存器和存储器,N为源操作数的字节数2或4或8。POP指令:从栈顶弹出操作数到目标操作数;SP+NSP 目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。,PUSH/POP指令,2023/11/3,(2)PUSH/PUSHA/POPA,是80286新增的指令指令格式:PUSH imm16 PUSHA POPA指令功能:PUSH imm16将字立即数压入堆栈,如果给出的数 不够16位,它会在自动扩展后压入堆栈;PUSHA指令将所有通用寄存器的内容压入堆栈,压 入的顺序是:AX、CX、DX、BX、SP、BP、SI、DI;POPA指令将栈顶内容弹出,顺序与压入的相反(弹出 到SP的值被丢弃)。,2023/11/3,(3)PUSHAD/POPAD,386新增指令 PUSHAD指令将所有扩展通用寄存器的内容压入堆栈,压入的顺序是:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI;POPAD弹出的顺序与PUSHAD压入的相反(弹出到ESP的值被丢弃)。注意:在64位模式下,入栈和出栈指令的操作数只能是16位或64位,不支持32位操作数。,2023/11/3,4.2.3 地址传送指令,(1)有效地址传送指令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;将变量LISTS的64位有效地址传送至RDXLEA EDX,RAX;将RAX的64位地址的低32位(即EAX的值)传送至EDXLEA SI,RAX;将RAX的64位地址的低16位(即AX的值)传送至SI,2023/11/3,(2)地址指针传送指令LDS和LES,指令格式:LDSREG16/REG32,MEM LESREG16/REG32,MEM指令功能:都是将由源操作数偏移地址决定的双字(或三字)单元中的第一个(或前两个)字的内容送入指令指定的16位(或32位)通用寄存器,第二个(或第三个)字的内容传送给段寄存器DS或ES,这两个段寄存器是隐含的目的操作数。TAB1 DF 123456789ABCH;定义TAB1为6个字节数据TAB2 DD 56781234H;定义TAB2为4个字节数据LDS BX,TAB1;将9ABCHBX,5678HDSLES SI,TAB2;将1234HSI,5678HESLES EAX,TAB1;将56789ABCHEAX,1234HES只适用于16位或32位地址模式,在64位地址下不能使用,2023/11/3,3)地址指针传送指令LFS、LGS和LSS,386新增指令指令功能:与上述的LDS功能基本一样,不同的是将第二个(或第三个)字的内容分别传送给隐含的段寄存器FS、GS和SS。注意:在16位模式下,偏移地址为16位,上述各指令的目的寄存器用16位的;在32位保护模式下,偏移地址为32位,上述各传送指令的目的寄存器应该是32位的。但段寄存器总是16位的。,2023/11/3,4.2.4 标志位传送指令,(1)标志寄存器读写指令LAHF/SAHF指令LAHF用于将标志寄存器的低字节(含SF、ZF、AF、PF和CF)读出后传送到AH寄存器。不影响标志位指令SAHF与LAHF的操作相反,它把寄存器AH中的内容写入标志寄存器的低字节,取代某些标志位(SF、ZF、AF、PF和CF)的原来状态。,2023/11/3,2)标志寄存器入栈出栈指令,PUSHF指令的执行过程同PUSH指令,只是将标志寄存器FLAG的内容压入堆栈。POPF则将当前栈顶的一个字传送给标志寄存器,同时修改SP+2SP。PUSHFD/POPFD指令是386新增的指令,功能与PUSHF/POPF基本相同,但操作为EFLAG与堆栈之间的传送。PUSHFQ指令和POPFQ指令是64位指令,用于RFLAGS与堆栈之间的64位传送,只能用于64位地址方式。,2023/11/3,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位数到AXMOV 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位方式下相同。,2023/11/3,(2)字符串输入指令INS,指令形式:INSB:从DX指定的端口输入一个字节到ES:DI指定的 内存单元中去。INSW:从DX指定的端口输入一个字到ES:DI指定的内 存单元中去。INSD:从DX指定的端口输入双字到ES:DI指定的内存 单元中去。注意:若方向标志DF=0,则DI中的地址自动+1(输入字节)或+2(输入字)或+4(输入双字);若方向标志DF=1,则DI中的地址自动-1(输入字节)或-2(输入字)或-4(输入双字)。在64位方式下目标地址偏移量由EDI或RDI指明,指令功能和用法不变,2023/11/3,(3)字符串输出指令OUTS,OUTSB:从DS:SI指定的内存单元输出 一个字节到DX指定的端口中去。OUTSW:从DS:SI指定的内存单元址 输出一个字到DX指定的端口中去。OUTSD:从DS:SI指定的内存单元输出 双字到DX指定的端口中去。方向标志DF的用法同INS指令,2023/11/3,4.3 算术运算类指令,加法减法乘法,除扩展指令外,指令的执行结果都影响状态标志位,除法扩展十进制调整,2023/11/3,一加减法类指令,(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。,2023/11/3,(2)带进位、借位的加减法指令ADC/SBB,指令格式:ADCOPRD1,OPRD2 SBBOPRD1,OPRD2指令功能:常用于长度为两个字或两个字以上的操作数的运算,加法操作时在最低位加上进位位CF,或减法操作时减去借位位CF。例如:如果有一个64位数据已存放在EAX(高32位)和EBX(低32位)中,现要加上一个常数123456789ABCDEF0H,这时可用下面两条指令实现:ADD EBX,9ABCDEF0H ADC EAX,12345678H,2023/11/3,(3)增量和减量指令INC/DEC,指令格式:INC MEM/REG DEC MEM/REG功能:是单操作数指令,完成对指定的操作数加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前缀代码相同,所以不能使用。,2023/11/3,(4)求补指令NEG,指令格式:NEGREG/MEM功能:用零减去操作数,再把结果送回操作数。该指令执行的效果是改变操作数的符号,将正数变成负数或将负数变成正数,但绝对值不变,所以又称为取负指令。注意: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位内存操作数求相反数,2023/11/3,(5)比较指令CMP,指令格式:CMP OPRD1,OPRD2功能:将OPRD1OPRD2,运算结果不送回OPRD1,执行后不改变源操作数和目标操作数,仅仅影响标志位,其它方面和SUB指令相同。讨论:1)如果是两个无符号数比较,可根据CF来判断:若CF1,则OPRD1OPRD2。2)如果是两个有符号数比较,要根据SF和OF来判断:若SFOF0,则OPRD1OPRD2;若SFOF1,则OPRD1OPRD2。3)不管操作数有无符号,若ZF1则两者相等,否则不等.,2023/11/3,(6)交换加法指令XADD,指令格式:XADD REG/MEM,REG功能:首先将两个操作数的内容交换,然后两个操作数的值相加,结果送入第一个操作数。(7)比较并交换指令CMPXCHG 指令格式:CMPXCHG REG/MEM,REG 功能:将目标操作数与AL、AX或EAX的内容进行比较:如果相等则ZF=1,并将源操作数送入目标操作数;否则ZF=0,并将REG/MEM送到相应的累加器。例如:CMPXCHG ECX,EDX 若ECXEAX,则ECXEDX,且ZF1;否则,EAXECX,且ZF0。,2023/11/3,(8)8字节比较并交换指令CMPXCHG8B,指令格式:CMPXCHG8B MEM64 功能:将EDX(高32位):EAX(低32位)的值与内存单元MEM64中的64位数进行比较,若相等,则置ZF=1,并将ECX:EBX的值传送到MEM64指定的内存地址;否则,置ZF=0,将MEM64的8字节内容传送到EDX:EAX。该指令只影响ZF标志。,2023/11/3,二乘除法指令,(1)乘法指令MUL/IMUL指令格式:MUL REG/MEM IMUL REG/MEM 功能:分别用于实现无符号数的乘法和有符号数的乘法运算。它们都只有一个源操作数,可以是寄存器或存储器,而目标操作数隐含规定在累加器中。,2023/11/3,当乘积的高半部分(字节相乘时为AH、字相乘时为DX、双字相乘时为EDX、64位相乘时为RDX)不为0,则标志CF=OF=1,表示在AH(或DX、EDX、RDX)中存有结果的有效数字;否则CF=OF=0,2023/11/3,(2)除法指令DIV/IDIV,指令格式:DIVREG/MEM IDIVREG/MEM 功能:分别用于无符号数的除法和带符号数的除法运算。指令中对操作数的规定同乘法指令,除法指令执行后,所有的状态标志都不确定。,若商超过存放它的寄存器的容量(分别为8位、16位、32位或64位)则引起0型中断(即除法出错中断),商和余数的值不能确定。,2023/11/3,(3)有符号多操作数乘法指令,指令格式一:IMUL reg16,reg16/mem16/imm16/imm8 IMUL reg32,reg32/mem32/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位有符号数),如果溢出,则溢出部分丢掉,并置CF=OF=1,否则CF=OF=0,其余标志位无定义。,2023/11/3,【例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,2023/11/3,三符号扩展指令,1基本符号扩展指令CBW/CWDE/CDQE指令格式:CBW CWDE CDQE功能:操作数隐含规定在累加器中。CBW将AL中的字节符号数的符号扩展到AX中;CWDE将AX中的字有符号数的符号扩展到EAX中;CDQE将EAX中的字有符号数的符号扩展到RAX中,只能在64位方式下使用。扩展规则如下:若AL80H,则AH0 若AL80H,则AH0FFH若AX8000H,则EAX高16位0 若AX8000H,则EAX高16位0FFFFH若EAX80000000H,则RAX高32位0 若EAX80000000H,则RAX高32位0FFFFFFFFH这3条指令都不影响任何标志。,2023/11/3,2双寄存器符号扩展指令CWD/CDQ/CQO,指令格式:CWD CDQ CQO功能:CWD功能为将AX寄存器的内容符号扩展到DX中;CDQ指令的功能为将EAX寄存器的内容符号扩展到EDX中;CQO指令的功能为将RAX寄存器的内容符号扩展到RDX中,只能在64位方式下使用。它们都不影响标志位。一般来说符号扩展指令大都与除法指令相结合,为达到被除数的位数要求而扩展。【例3.29】求0ABCH0200H(带符号数相除)由于除数为字,则必须将原来的被除数进行符号扩展后才能相除。MOVAX,0ABCHCWD;被除数扩展为DX:AX00000ABCHMOVBX,0200HIDIVBX;AX商0AH,DX余数E5H,2023/11/3,3扩展传送指令MOVSX/MOVZX,指令格式:MOVSX REG16/REG32/REG64,REG8/MEM8/REG16/MEM16 MOVZX REG16/REG32/REG64,REG8/MEM8/REG16/MEM16源操作数的长度小于目标操作数的长度;若目标操作数是64位寄存器,则该指令只能用在64位方式下。MOVSX用于传送有符号数,并将符号位扩展到目标操作数的所有位;MOVZX用于传送无符号数,将0扩展到目标操作数的所有位。常用于作除法时对被除数位数的扩展。【例3.30】MOVZX EAX,CX;将CX中16位数零扩展为32位送入EAX MOVSX RCX,AL;将AL内容符号扩展为64位送入RCX。,2023/11/3,四BCD算术运算指令,(1)非压缩BCD码加/减法调整指令AAA/AAS指令格式:加法调整指令AAA 减法调整指令AAS功能:若(AL&0FH)9或标志AF=1,则ALAL6AHAH1AF1CFAFALAL&0FH,2023/11/3,(2)压缩BCD码加减法调整指令DAA/DAS,指令格式:加法调整指令DAA 减法调整指令DAS功能:若(AL&0FH)9或AF=1,则ALAL6AF1若AL9FH或CF=1,则ALAL60HCF1;,【例3.31】AL=65H(十进制数65的BCD码),BH=47H(十进制数47的BCD码),用下列指令可得到这两个数和的正确结果。SUB AL,BH;ALALBH(AL的值为1EH)DAS;将AL的内容调整为18H,2023/11/3,(3)非压缩BCD码乘除法调整指令AAM/AAD,指令格式:乘法调整指令AAM 除法调整指令AADAAM紧跟在MUL指令之后,能把在AX中的两个非压缩BCD数相乘的结果进行调整,得到正确的非压缩BCD的乘积(高位在AH中,低位在AL中)。调整操作为:AHAL/0AH;AH AL被0AH除的商ALAL0AH;AL AL被0AH除的余数AAD指令用来在进行两个非压缩BCD数的除法运算之前,先调整AL和AH中的内容,再用二进制除法指令DIV相除。相除以后,以非压缩BCD数表示的商在AL中,而相应的余数在AH中。调整操作为:ALAH0AH+ALAH0,2023/11/3,4.4 逻辑运算与移位指令,(1)逻辑非指令NOT指令格式:NOT reg/mem 功能:将操作数按位取反送回。例:NOT EAX;若指令执行前(EAX)=66668888H,则指令执行后(EAX)=99997777H。,一逻辑运算指令,2023/11/3,(2)逻辑与/或/异或指令,指令格式:AND/OR/XORreg/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位的状态,2023/11/3,(3)测试指令TEST,指令格式:TESTreg/mem,reg/mem/imm指令功能:与AND指令相同,但操作结果不送回目标操作数,即两个操作数不变,只影响标志位。例:若要检测AL中的最低位是否为1,为1则转移,可使用以 下指令:TEST AL,01HJNZ THAT;ZF0,则AL寄存器的第0位为1,转移到THATTHAT:,2023/11/3,二移位和循环移位指令,2023/11/3,(1)移位指令SHL/SAL/SHR/SAR,具体指令为:SHL/SAL/SHR/SARreg/mem,1/CL/imm8指令影响PF、SF、ZF、CF以及OF五个标志位,对AF的影响不确定。CF:总是等于目标操作数最后移出的那一位。OF:-如果移位计数值为1,且执行结果使目标操作数的符号位(最高位)发生变化,则OF=1,否则OF=0;-若移位计数值不为1,则OF状态不定。,2023/11/3,【例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,2023/11/3,(2)循环移位指令ROL/ROR/RCL/RCR,具体指令为: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,2023/11/3,4.5 串操作类指令,2023/11/3,1)约定以DS:SI寻址源串,以ES:DI寻址目标串,所以指令中不必显式指明操作数。其中源串的段寄存器DS可通过加段超越前缀而改变,但目标串的段寄存器ES不能超越。在32位处理器中,也可以用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位处理器中,也可以用ECX/RCX做为串重复次数寄存器。,串操作指令共同点,2023/11/3,一重复前缀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指令之前时,上述重复执行步骤变为:若CX=0或ZF=1,停止重复过程。,2023/11/3,二基本串操作指令,(1)串传送指令MOVS/MOVSB/MOVSW/MOVSD/MOVSQ指令格式:MOVSOPRD1,OPRD2MOVSB;字节串传送MOVSW;字串传送MOVSD;双字串传送MOVSQ;4字串传送功能:把DS:SI指定的源串中的一个字节或字,传送至由ES:DI指定的目标串。且根据方向标志DF自动地修改SI、DI,以指向串中的下一个元素。,2023/11/3,例:将数据段内起始地址在SOURCE(段内偏移地址)的一数据块传送到附加段地址在DEST的存储单元中去,可用下面的程序段来实现(假设数据块长度=100字节):LEASI,SOURCELEADI,DESTMOVCX,50;设置循环操作次数100/2CLD;设置方向标志DF0GO_ON:MOVSWDECCXJNZGO_ON 若采用重复前缀,则上述程序简化为:LEASI,SOURCELEADI,DESTMOVCX,50;设置循环操作次数CLD;设置方向标志DF0REPMOVSW,2023/11/3,(2)串比较指令CMPS/CMPSB/CMPSW/CMPSD/CMPSQ,指令格式:CMPSOPRD1,OPRD2 CMPSB;字节串比较 CMPSW;字串比较 CMPSD;双字串比较 CMPSQ;4字串比较功能:将DS:SI指定的源串中的元素减去由ES:DI指定的目标串中的相应元素,但两个存储单元中的内容不变,而是用标志位的变化表示比较结果,同时根据方向标志DF自动修改源和目标串指针SI、DI。若CMPS指令前加上前缀REPE/REPZ,则表示:当串未结尾(CX0)且串相等(ZF=1)时继续比较;如果CMPS用REPNE/REPNZ作前缀,则表示:当串未结尾(CX0)且串不相等(ZF=0)时继续比较。,2023/11/3,例:比较两个字符串是否有相同的元素,它们的首地址和目标地址分别为SRC和DST,字符串的长度为N个字节。CLD;DF=0,增量方向 LEA SI,SRC;字符串首地址送DS:SI LEA DI,ES:DST;目标地址送ES:DI MOV CX,N;字符串长度 REPNE CMPSB;重复比较字符串JNZ NOT_FOUND;无相同的元素,转NOT_FOUND,否则继续执行下条指令NOT_FOUND:若两个字符串没有相同的元素,则串比较指令一直重复执行,直至(CX)=0为止,并转入下一条条件转移指令JNZ,判断比较结果是否为0。显然,由于未找到相同的元素,因此比较结果非0,转NOT_FOUND执行。,2023/11/3,(3)串搜索指令SCAS/SCASB/SCASW/SCASD/SCASQ,指令格式:SCASOPRD SCASB;搜索字节串 SCASW;搜索字串 SCASD;搜索双字串 SCASQ;搜索4字串功能:将累加器(AL或AX)中的内容与ES:DI)指定的目标串元素(字节或字或双字或4字)进行比较(减法操作),用标志位反映比较的结果,而不改变累加器和目标串的内容,达到字符串搜索的目的,同时自动修改指针DI。在SCAS指令前加有REPE/REPZ前缀,则表示:当串未结尾(CX0)且串元素关键值(ZF=1)时继续搜索。用来搜索与给定关键值不同的内容。在SCAS指令前加有REPNE/REPNZ前缀,则表示:当串未结尾(CX0)且串元素关键值(ZF=0)时继续搜索,直到CX=0或ZF1才执行下一条指令。可以用来在一个串中查出某一指定元素。,2023/11/3,例:在首地址为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为止,并转入下一条指令继续执行。否则,将提前转入下一条指令继续执行。,2023/11/3,(4)串元素存取指令,指令格式:STOS/LODSOPRD STOSB/LODSB;存/取字节串 STOSW/LODSW;存/取字串 STOSD/LODSD;存/取双字串 STOSQ/LODSQ;存/取4字串STOS将累加器(AL或AX)的内容存入由ES:DI指定的目标串中去,同时自动修改DI。指令前可加重复前缀REP,以给一个内存块赋同一个值。LODS将DS:SI指定的源串中的元素,传送到AL(字节操作)或AX(字操作)寄存器中,同时自动修改SI。,2023/11/3,例:将首地址为DS:SRC的32位数据串中值为87654321H的元素送到首地址为ES:DST的内存区中。字符串长度为1000H字节。CLD;DF=0,增量方向 LEA ESI,SRC;字符串首地址送DS:SI LEA EDI,ES:DST;目标地址送ES:DI MOV ECX,400H;字符串长度1000H/4=400HCONTINUE:LODSD;取字符串的一个元素 CMP EAX,87654321H;字符串元素为87654321H吗?JNE NEXT;不是,继续取下一个元素 STOSD;是,存入首地址为ES:DST的内存区中NEXT:DEC ECX JNZ CONTINUE利用DEC和JNZ指令控制串操作指令的重复执行次数。当(ECX)0时,程序重复循环,直至(ECX)=0为止。,2023/11/3,4.6 控制转移类指令,一无条件转移指令JMP指令格式:JMP目标标号JMP指令有以下5种形式:(1)段内直接短转移:JMPSHORT lable功能:无条件地转移到lable所指定的目标地址。短(SHORT)转移时,目标地址与JMP指令的下一条指令地址之差在-128127字节之间,即跳转地址的偏移范围为8位带符号二进制数范围,属于相对转移。(2)段内直接近转移:JMPNEAR PTR lable功能:无条件转移到目标地址lable。跳转地址的偏移范围为16位带符号二进制数的范围,即32K,属于相对转移。(3)段内间接转移:JMP reg 或 JMP mem功能:无条件转移到由寄存器的内容指定的目标地址,或由寄存器间接寻址、基址变址、相对基址变址提供的存储单元内容所指定的目标地址,是一种绝对转移指令。,2023/11/3,例:MOVBX,1000HJMPBX;程序将转向1000H,即IP1000HJMPWORD PTR BX+20H设DS2000H,21020H=34H,21021H=12H,则第二个JMP将程序转向1234H,即IP1234H。(4)段间直接转移:JMPFAR PTR lable功能:无条件转移到指定段内的目标地址lable,是绝对转移指令。例:CODE1SEGMENTCODE2SEGMENTJMPFAR PTR DESTDEST:CODE1 ENDS CODE2ENDS目标地址也可直接用数值表达式给出,这时可省略FAR属性说明。JMP FAR PTR 2000H:0100H程序将转向段地址为2000H,偏移地址为0100H的单元,2023/11/3,(5)段间间接转移:JMPmem功能:程序将转向由mem指定的双字指针中第一个字单元的内容作为IP,第二个字单元的内容作为CS的目标地址。例:MOVSI,0100HJMPDWORD PTR SI把DS:SI即DS:0100H和DS:0101H两单元的字送IP,而把DS:0102H和DS:0103H两单元的字送CS。程序转入由新的CS和新的IP决定的目标地址。在32位保护模式下,段内转移的目标地址为32位偏移地址,段间转移的目标地址为48位虚拟地址(16位段选择符:32偏移地址)。例:JMP EBX;段内转移,EIP=EBX JMP FWORD PTR EBX;段间转移,目标地址为EBX指向的48位虚拟地址,;CS=其中的高16位,EIP=其中的低32位,2023/11/3,在64位模式下,指令指针为RIP。JMP指令的执行分为相对转移和绝对转移两种情况:若为相对转移,则用RIP寄存器与机器码中的位移量字段相加的和修改RIP值,此时位移量字段不能超过32位,并将其符号扩展为64位再相加;若为绝对转移,则把机器码中指出的寄存器或内存单元的值直接填入RIP(若不足64位将进行0扩展),实现64位地址空间的转移。【例】JMP 30000H;若原来RIP=20000H,则将RIP加10000H,实现相对转移 JMP R15;程序将转向R15指向的地址,即RIPR15,实现绝对转移,2023/11/3,二条件转移类指令,(1)根据单个标志位的条件转移指令 JC TAB1;当(AX-BX)有借位时,转至TAB1。CMP CX,DX JNE TAB2;当CXDX(即CXDX0)时,转至TAB2。,2023/11/3,(2)用于无符号数比较的条件转移指令,表3.9中的1114条指令,检测无符号数比较结果的特征标志CF和ZF。例:比较无符号数FEH和01H的大小,执行下面的指令后,将转移到ABOVE处继续执行指令。MOV AL,0FEH CMP AL,01H JA ABOVE ABOVE:,2023/11/3,(3)用于有符号数比较的条件转移指令,表3.9中的最后四条指令检测的是SF、OF以及ZF标志,表示两个有符号数间的大小关系。例:比较有符号数FEH和01H的大小,下面的指令,将不转移到greater,而是继续执行JG下面的一条指令,因为有符号数0FEH01H。MOV AL,0FEH CMP AL,01H JG GREATER,2023/11/3,三调用与返回指令,1调用指令CALL指令格式:CALL OPRD 用于调用子程序(或过程)OPRD,它和JMP指令相似。段内直接调用 操作:PUSH IP;IP入栈(IP)(IP)+16位位移量;转向子程序入口,2023/11/3,段内间接调用(CALL NEAR PTR DST),操作:PUSH IP;IP入栈(IP)(EA);转向子程序入口-IP的值不是CALL指令的下一条指令地址加上16位位移量,而是直接将DST的有效地址送入IP,这是一种绝对调用指令。例:CALL BX;EA在BX中 CALL WORD PTR BX;EA在字存储单元中,2023/11/3,段间直接调用(CALL FAR

    注意事项

    本文(汇编语言程序设计及上机指导第4章指令系统.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开