【文档说明】第4章指令系统汇编语言分解课件.ppt,共(92)页,2.499 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44756.html
以下为本文档部分文字说明:
2022年11月24日星期四1第4章指令系统【本章提要】本章重点讲述IA-32系列CPU的常用指令,和支持EM64T技术的高级Pentium4以及Core系列CPU的Intel64指令系统。【学习目标】•熟练掌握汇编语言各种指令的功能和操作数在内存的存放规律•掌握各种指令对操作数和寻址方式
的特殊要求,明确不同指令对标志寄存器的具体影响等方面•熟悉CPU内部各寄存器的使用规则及其在指令执行过程中的隐含约定《汇编语言程序设计及上机指导》第4章22022年11月24日星期四80X86指令集8086指令集PentiumX指令集Core2指令集指令系统是C
PU所能执行的各种指令的集合,定义了计算机硬件所能完成的基本操作,不同的CPU有不同的指令系统。8086/8088CPU的指令系统是基本指令集,80X86、PentiumX以及Core2系列的指令系统保留了基本指令集,又进行了扩充。4.1指令系统概述《汇编语言程序设计及上机指导》第4
章32022年11月24日星期四8086/8088指令系统是基本指令集,指令的操作数宽度是8位或16位,偏移地址宽度是16位。IA-32扩充指令和系统控制指令的操作数宽度可以是8位、16位或32位,偏移地址宽度一般是32位。64位
方式指令的操作数可以是8位、16位、32位或64位,操作数的偏移地址可以是16位、32位或64位。指令系统大体可以分成7个功能组:数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理器控制和其他类。《汇编语言程序
设计及上机指导》第4章42022年11月24日星期四符号意义OPRD,OPRDN操作数,第N个操作数如OPRD1、OPRD2、OPRD3等DEST,SRC目的操作数,源操作数REG88位通用寄存器AH/AL/BH/B
L/CH/CL/DH/DL/SIL/DIL/SPL/BPL以及R8L~R15LREG1616位通用寄存器AX/BX/CX/DX/SI/DI/BP/SP以及R8W~R15WREG3232位通用寄存器EAX/EBX/EC
X/EDX/ESI/EDI/EBP/ESP以及R8D~R15DREG6464位通用寄存器RAX/RBX/RCX/RDX/RSI/RDI/RBP/RSP以及R8~R15REGREG8/REGL6/REG32/REG64SEG段寄存器DS/CS/SS/ES/FS/GSMEM8/MEM16/
MEM32/MEM648位/16位/32位/64位内存操作数MEMMEM8/MEM16/MEM32/MEM64IMM8/IMM16/IMM32/IMM648位/16位/32位/64位立即数IMMIMM
8/IMM16/IMM32/IMM64《汇编语言程序设计及上机指导》第4章52022年11月24日星期四4.2数据传送类指令指令书写格式指令功能MOVREG/MEM/SEG,REG/MEM/SEG/IMMXCHGREG/MEM,REG/MEMXLATBSWAPREG32从SRC传送到DEST交换两
个操作数的内容字节翻译字节交换指令(486新增)1.通用数据传送2.堆栈操作3.地址传送4.标志位传送5.I/O数据传送传送类指令执行后对标志位都没有影响(除SAHF、POPF和POPFD外)。4.2.1
通用数据传送指令《汇编语言程序设计及上机指导》第4章62022年11月24日星期四(1)MOV指令指令格式:MOVOPRD1,OPRD2功能:将源操作数传送给目标操作数【例】MOVAL,BH;通用寄存器之间传送字节数据MOVDS,AX;通用寄存器与段寄存器(CS不能是目标)之间传送数据MO
VEAX,12345678H;立即数传送到通用寄存器MOVRAX,BUFFER;通用寄存器与存储器之间64位数据传送MOVDAT[BP+DI],ES;段寄存器与存储器之间传送数据《汇编语言程序设计及上机指导》第4章72022年11月2
4日星期四MOV指令操作数要求段寄存器DS/CS/SS/ES/FS/GS通用寄存器8位、16位、32位、64位存储器立即数8位、16位、32位、64位注意:①立即数和段寄存器CS不能作为目标操作数;②
立即数不能直接传送到段寄存器;③两个存储单元之间不能直接传送数据;④两个段寄存器之间不能直接传送数据;⑤两个操作数宽度必须一致。《汇编语言程序设计及上机指导》第4章82022年11月24日星期四(2)交换指令XCHG指令格式:XCHGOPRD1,OPRD2功能:将OPRD1与OPRD2进
行交换。二者都是源操作数也都是目的操作数。操作数可以是寄存器或内存数变量。【例】MOVEAX,12345678H;EAX=12345678HMOVEBX,56781234H;EBX=56781234HXCHGEAX,EBX;交换后,EAX=56781234H,EBX=12345678HXC
HGR8,[100];R8寄存器内容与内存100号地址中的64位数据交换注意:①不能在两个存储单元之间直接交换数据;②段寄存器和立即数不能作为操作数。《汇编语言程序设计及上机指导》第4章92022年11月24日星期四(3)查表转换指令XLAT指令格式:XLAT功能:
完成一个字节的查表转换,将数据段中偏移地址为BX/ebx/RBX与AL寄存器之和的存储单元的内容送入AL寄存器,即:[BX+AL]→AL。例:若(BX)=0100H,(AL)=05H,执行XLAT指令后,(AL)=2CH。注意:由于AL只有8位,所以表的长度不能超过256字节。
《汇编语言程序设计及上机指导》第4章102022年11月24日星期四(4)字节交换指令BSWAP是80486新增的指令指令格式:BSWAPreg32功能:将32位通用寄存器中的双字以字节为单位进行高、低
字节交换,改变双字数据的存放方式。指令执行时,字节0(b0~b7)与字节3(b24~b31)交换,字节1(b8~b15)与字节2(b16~b23)交换。字节3字节2字节1字节0《汇编语言程序设计及上机指导》第4章112022年11月24日星期四4.2.2堆栈操作指令指令
书写格式指令功能PUSHREG/MEM/SEGPOPREG/MEM/SEGPUSHIMMPUSHAPOPAPUSHADPOPAD压入堆栈弹出堆栈IMM扩展为16/32位后进栈(286新增)8个16位通用寄存器进栈(286新增)8个16位通用寄存器出栈(286新增)8个32位通用寄存器
进栈(386新增)8个32位通用寄存器出栈(386新增)(1)PUSH/POP堆栈是内存的一个数据区,是按照先进后出原则组织的一段内存区域,段寄存器SS指向段基址,堆栈指针SP始终指向堆栈的顶部。PUSHREG
16/REG32/REG64/MEM16/MEM32/MEM64POPREG16/REG32/REG64/MEM16/MEM32/MEM64《汇编语言程序设计及上机指导》第4章122022年11月24日星期
四PUSH指令:①SP-N→SP;②16/32/64位的源操作数压入堆栈源操作数可以是通用寄存器、段寄存器和存储器,N为源操作数的字节数2或4或8。POP指令:①从栈顶弹出操作数到目标操作数;②SP+N→SP目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。PUSH/POP指令
《汇编语言程序设计及上机指导》第4章132022年11月24日星期四(2)PUSH/PUSHA/POPA是80286新增的指令指令格式:PUSHimm16PUSHAPOPA指令功能:①PUSHimm16将字立即数压入堆栈
,如果给出的数不够16位,它会在自动扩展后压入堆栈;②PUSHA指令将所有通用寄存器的内容压入堆栈,压入的顺序是:AX、CX、DX、BX、SP、BP、SI、DI;③POPA指令将栈顶内容弹出,顺序与压入的相反(弹出到SP的值被丢弃)。《汇编语言程序设计及上机指导》第4
章142022年11月24日星期四(3)PUSHAD/POPAD386新增指令PUSHAD指令将所有扩展通用寄存器的内容压入堆栈,压入的顺序是:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI;POPAD弹出的顺序与PUSHAD
压入的相反(弹出到ESP的值被丢弃)。注意:在64位模式下,入栈和出栈指令的操作数只能是16位或64位,不支持32位操作数。《汇编语言程序设计及上机指导》第4章152022年11月24日星期四4.2.3地址传送指令(1)有效地址传送指令LEA指令格式:LEAREG16/R
EG32/REG64,MEM功能:将源操作数在当前段内的有效地址(即地址偏移量)传送至目标操作数。区别:MOV指令传送操作数的内容,而LEA传送的是操作数的地址。MOVDI,LISTS;将变量LISTS的内容传送至DI,DI=1234HLE
ADX,LISTS;将变量LISTS的偏移地址传送至DX,DX=2000HLEAAX,[3000H];将3000H单元的偏移地址传送至AX,AX=3000HLEAESI,LISTS;将变量LISTS的32位偏移地址传送至ES
I,ESI=00002000HLEARDX,LISTS;将变量LISTS的64位有效地址传送至RDXLEAEDX,[RAX];将[RAX]的64位地址的低32位(即EAX的值)传送至EDXLEASI,[RAX];将[RAX]的64位地址的低16位(即AX的值)传送至SI《汇编语
言程序设计及上机指导》第4章162022年11月24日星期四(2)地址指针传送指令LDS和LES指令格式:LDSREG16/REG32,MEMLESREG16/REG32,MEM指令功能:都是将由源操作数偏移地址决定的双字(或三字)单元中的第一
个(或前两个)字的内容送入指令指定的16位(或32位)通用寄存器,第二个(或第三个)字的内容传送给段寄存器DS或ES,这两个段寄存器是隐含的目的操作数。TAB1DF123456789ABCH;定义TAB1为6个字节数据TAB2DD56781234H;定义TAB2为4个字节数据LDSBX
,TAB1;将9ABCH→BX,5678H→DSLESSI,TAB2;将1234H→SI,5678H→ESLESEAX,TAB1;将56789ABCH→EAX,1234H→ES只适用于16位或32位地址模式,在64位
地址下不能使用《汇编语言程序设计及上机指导》第4章172022年11月24日星期四3)地址指针传送指令LFS、LGS和LSS386新增指令指令功能:与上述的LDS功能基本一样,不同的是将第二个(或第三个)字的内容分别传送给隐含
的段寄存器FS、GS和SS。注意:在16位模式下,偏移地址为16位,上述各指令的目的寄存器用16位的;在32位保护模式下,偏移地址为32位,上述各传送指令的目的寄存器应该是32位的。但段寄存器总是16位的。《汇编语言程序设计及上机指导》第4章182022年11月24日星期四4.2.4标志位
传送指令(1)标志寄存器读写指令LAHF/SAHF指令LAHF用于将标志寄存器的低字节(含SF、ZF、AF、PF和CF)读出后传送到AH寄存器。不影响标志位指令SAHF与LAHF的操作相反,它把寄存器AH中的内容写入标志寄存器的低字节,取代某些标志位(SF、ZF、AF、PF和CF)
的原来状态。指令书写格式指令功能LAHFSAHFPUSHFPOPFPUSHFDPOPFD将FLAG低字节装入AH寄存器将AH内容装入Flag低字节将FLAG内容压入堆栈从堆栈弹出Flag内容将EFLAG内容压入堆栈(386新增)从堆栈弹出32
位到EFLAG(386新增)《汇编语言程序设计及上机指导》第4章192022年11月24日星期四2)标志寄存器入栈出栈指令PUSHF指令的执行过程同PUSH指令,只是将标志寄存器FLAG的内容压入堆栈。POPF则将当前栈顶的一个字传送给标志寄
存器,同时修改SP+2→SP。PUSHFD/POPFD指令是386新增的指令,功能与PUSHF/POPF基本相同,但操作为EFLAG与堆栈之间的传送。PUSHFQ指令和POPFQ指令是64位指令,用
于RFLAGS与堆栈之间的64位传送,只能用于64位地址方式。《汇编语言程序设计及上机指导》第4章202022年11月24日星期四4.2.5输入/输出数据传送指令指令书写格式指令功能IN累加器,端口OUT
端口,累加器INSB/INSW/INSDOUTSB/OUTSW/OUTSD输入字节或字输出字节或字串输入(286/386新增)串输出(286/386新增)(1)简单输入输出指令IN/OUT指令格式:INAL/AX,IMM8/DXOUTIMM8/DX,
AL/AX指令功能:专门用于在AL或AX寄存器与I/O端口之间传送数据例:INAX,30H;从端口30H输入16位数到AXMOVDX,300HINAL,DX;从端口300H输入8位数到ALOUT60H,AL;将8位数从AL输出到端口60HOUTDX,AX;将16位数从AX输出到D
X指定的端口在80386以后的32位CPU中,还可以通过EAX对I/O端口进行双字数据操作。在64位系统中,使用方法和16位/32位方式下相同。《汇编语言程序设计及上机指导》第4章212022年11月24日星期四(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指明,指令功能和用法不变《汇
编语言程序设计及上机指导》第4章222022年11月24日星期四(3)字符串输出指令OUTSOUTSB:从DS:SI指定的内存单元输出一个字节到DX指定的端口中去。OUTSW:从DS:SI指定的内存单元址输出一个字到DX指定的端口中去。OUTSD:从
DS:SI指定的内存单元输出双字到DX指定的端口中去。方向标志DF的用法同INS指令《汇编语言程序设计及上机指导》第4章232022年11月24日星期四4.3算术运算类指令加法减法乘法除扩展指令外,指令的执行结果都影响状态标志位指令名称指令书写格式状态标志位OFSFZFA
FPFCF加法加法带进位加法加1交换加(486)ADDreg/mem,reg/mem/immADCreg/mem,reg/mem/immINCreg/memXADDreg/mem,regYYYYYYYYYYYYYYYYYYYYYYNY减法减法带借位减法减1取负比较比较交
换(486)8字节比较交换(奔腾)SUBreg/mem,reg/mem/immSBBreg/mem,reg/mem/immDECreg/memNEGreg/memCMPreg/mem,reg/mem/immCMPXCHGreg/mem,regCMPXCHG8Bm
em64YYYYYYYYYYYYYYYYYNYYYYY1YYYYYYYYYYYYNNYNNN除法扩展十进制调整《汇编语言程序设计及上机指导》第4章242022年11月24日星期四一.加减法类指令(1)加减法指令ADD/SUB指令格式:ADDreg/mem,reg/mem/immS
UBreg/mem,reg/mem/imm功能:ADD完成两个操作数的加运算,结果送入第一个操作数;SUB完成第一个操作数减去第二个操作数,差送回到第一个操作数。0110010110100000+)101101111001111010001110100111110结果
非零:ZF=0无进位:AF=0低8位为偶数个1:PF=0最高位有进位:CF=1最高位为0:SF=0OF=最高位进位1⊕次高位进位1,则OF=0【例】设AX=65A0H,BX=B79EH,指令ADDBX,AX的执行情况如下:BX=
1D3EH,CF=1,SF=0,OF=0,AF=0,PF=0,ZF=0。《汇编语言程序设计及上机指导》第4章252022年11月24日星期四(2)带进位、借位的加减法指令ADC/SBB指令格式:ADCOP
RD1,OPRD2SBBOPRD1,OPRD2指令功能:常用于长度为两个字或两个字以上的操作数的运算,加法操作时在最低位加上进位位CF,或减法操作时减去借位位CF。例如:如果有一个64位数据已存放在EAX(高32位)和EBX(低32位)中,现
要加上一个常数123456789ABCDEF0H,这时可用下面两条指令实现:ADDEBX,9ABCDEF0HADCEAX,12345678H《汇编语言程序设计及上机指导》第4章262022年11月24日星期四(3)增量和减量指令INC/DEC指令格式:INCMEM/REGD
ECMEM/REG功能:是单操作数指令,完成对指定的操作数加1/减1(1是隐含的),然后返回此操作数。注意:指令执行的结果影响标志位AF、OF、PF、SF和ZF,而不影响进位标志CF。例:INCCX;CX寄存器中的内容加1DECWORDPTR[EAX];把EAX指
向的字存储单元内容减1在64位方式下,大多数INC/DEC指令都是可以使用的。但是单字节编码的INC/DEC指令因为与16个REX前缀代码相同,所以不能使用。《汇编语言程序设计及上机指导》第4章272022年11月24日星期四(4)求补指令NEG指令格式:NEGREG/MEM功能:用零减去操
作数,再把结果送回操作数。该指令执行的效果是改变操作数的符号,将正数变成负数或将负数变成正数,但绝对值不变,所以又称为取负指令。注意:NEG指令影响所有状态标志:若操作数不是0,则总是使CF=1,否则置0;若在字节操作时对-128、或在
字操作时对-32768求补、或在32位操作时对-232求补则操作数没变化,但溢出标志OF=1。例:NEGEBX;对EBX求补,即EBX←0-EBXNEGBYTEPTR[SI];对8位内存操作数求相反数NEGAL;AL←0-ALADDAL,200;以上两
条指令实现AL←(200-AL)的运算NEGRAX;RAX←0-RAXNEGQWORDPTR[EAX];对64位内存操作数求相反数《汇编语言程序设计及上机指导》第4章282022年11月24日星期四(5)比较指令CMP指令格式:CMPOPRD1,OPRD2功能:将OPRD1-OPRD2
,运算结果不送回OPRD1,执行后不改变源操作数和目标操作数,仅仅影响标志位,其它方面和SUB指令相同。讨论:1)如果是两个无符号数比较,可根据CF来判断:若CF=1,则OPRD1<OPRD2;若CF=0,则OPRD
1>OPRD2。2)如果是两个有符号数比较,要根据SF和OF来判断:若SF⊕OF=0,则OPRD1>OPRD2;若SF⊕OF=1,则OPRD1<OPRD2。3)不管操作数有无符号,若ZF=1则两者相等,否则不等.《汇编语言程序
设计及上机指导》第4章292022年11月24日星期四(6)交换加法指令XADD指令格式:XADDREG/MEM,REG功能:首先将两个操作数的内容交换,然后两个操作数的值相加,结果送入第一个操作数。(7)比较并交换指令CMPXCHG指令格式:CM
PXCHGREG/MEM,REG功能:将目标操作数与AL、AX或EAX的内容进行比较:如果相等则ZF=1,并将源操作数送入目标操作数;否则ZF=0,并将REG/MEM送到相应的累加器。例如:CMPXCHGECX,EDX若ECX=EAX,则ECX←EDX,且ZF=1;否则,EAX←ECX,且
ZF=0。《汇编语言程序设计及上机指导》第4章302022年11月24日星期四(8)8字节比较并交换指令CMPXCHG8B指令格式:CMPXCHG8BMEM64功能:将EDX(高32位):EAX(低32位)的值与内存单元MEM64中的64位数进行比较,若相等
,则置ZF=1,并将ECX:EBX的值传送到MEM64指定的内存地址;否则,置ZF=0,将MEM64的8字节内容传送到EDX:EAX。该指令只影响ZF标志。《汇编语言程序设计及上机指导》第4章312022年11月24日星期四二.乘
除法指令指令名称指令书写格式状态标志位OFSFZFAFPFCF乘法不带符号乘法带符号整数乘法双操作数乘三操作数乘MULreg/memIMULreg/memIMULreg,mem/immIMULreg,reg/mem,immYYYY****
************YYYY除法不带符号除法带符号整数除法DIVreg/memIDIVreg/mem************(1)乘法指令MUL/IMUL指令格式:MULREG/MEMIMULREG/MEM功能:分别用于实现无符号
数的乘法和有符号数的乘法运算。它们都只有一个源操作数,可以是寄存器或存储器,而目标操作数隐含规定在累加器中。《汇编语言程序设计及上机指导》第4章322022年11月24日星期四(32位乘积)(16位乘积)╳(8位源操作数)ALsrcAX字节乘法AX(16位源操作数)sr
c╳DXAX字乘法(64位乘积)╳(32位源操作数)EAXsrcEDXEAX32位乘法(128位乘积)╳(64位源操作数)RAXsrcRDXRAX64位乘法当乘积的高半部分(字节相乘时为AH、字相乘时为DX、双字相乘时为EDX、64位相乘时为RDX)不为0,则标志CF=OF=
1,表示在AH(或DX、EDX、RDX)中存有结果的有效数字;否则CF=OF=0《汇编语言程序设计及上机指导》第4章332022年11月24日星期四(2)除法指令DIV/IDIV指令格式:DIVREG/MEMIDIVREG/MEM功能:分别用于无符号数的除法和带符号数的除法运
算。指令中对操作数的规定同乘法指令,除法指令执行后,所有的状态标志都不确定。商余数余数商32位被除数16位被除数AX8位ALAHDXAX16位AXDX余数商64位被除数EDXEAX32位EAXEDX余数商128位被除数RDXRAX64位RAXRDX若
商超过存放它的寄存器的容量(分别为8位、16位、32位或64位)则引起0型中断(即除法出错中断),商和余数的值不能确定。《汇编语言程序设计及上机指导》第4章342022年11月24日星期四(3)有符号多操作数乘法指令指令
格式一:IMULreg16,reg16/mem16/imm16/imm8IMULreg32,reg32/mem32/imm32/imm8IMULreg64,reg64/reg32/mem64/imm32/imm8功能:用第一
个操作数乘以第二个操作数,返回的积存放在操作数1指定的寄存器中。指令格式二:IMULreg16,reg16/mem16,imm16/imm8IMULreg32,reg32/mem32,imm32/imm8IMULreg64,reg64/mem64,imm32/imm8功能:用第二
个操作数乘以第三个操作数,返回的积存放在操作数1指定的寄存器中。两种形式中,对乘积都限制其长度与第一个操作数的要一致(为16位、32位或64位有符号数),如果溢出,则溢出部分丢掉,并置CF=OF=1,否则CF=OF=0,其余标志位无定义。《汇编语言程序
设计及上机指导》第4章352022年11月24日星期四【例3.28】IMULBX,CX;BX←BX×CXIMULBX,100;BX←BX×100IMULAX,[BX+DI],1342H;AX←1342H×DS:[BX+DI]IMULAX,
BX,30;AX←30×BXIMULEAX,EBX,123456H;EAX←EAX×EBX×123456HIMULRAX,RBX,12345678H;RAX←RAX×RBX×12345678H《汇编语言程序设计及上机指导》第4
章362022年11月24日星期四三.符号扩展指令1.基本符号扩展指令CBW/CWDE/CDQE指令格式:CBWCWDECDQE功能:操作数隐含规定在累加器中。CBW将AL中的字节符号数的符号扩展到A
X中;CWDE将AX中的字有符号数的符号扩展到EAX中;CDQE将EAX中的字有符号数的符号扩展到RAX中,只能在64位方式下使用。扩展规则如下:①若AL<80H,则AH←0若AL≥80H,则AH←0FFH②若AX<8000H,则EAX高16位←0若AX≥8000H,
则EAX高16位←0FFFFH③若EAX<80000000H,则RAX高32位←0若EAX≥80000000H,则RAX高32位←0FFFFFFFFH这3条指令都不影响任何标志。《汇编语言程序设计及上机指导》第4章372022年11月24日星
期四2.双寄存器符号扩展指令CWD/CDQ/CQO指令格式:CWDCDQCQO功能:CWD功能为将AX寄存器的内容符号扩展到DX中;CDQ指令的功能为将EAX寄存器的内容符号扩展到EDX中;CQO指
令的功能为将RAX寄存器的内容符号扩展到RDX中,只能在64位方式下使用。它们都不影响标志位。一般来说符号扩展指令大都与除法指令相结合,为达到被除数的位数要求而扩展。【例3.29】求0ABCH÷0200H(带
符号数相除)由于除数为字,则必须将原来的被除数进行符号扩展后才能相除。MOVAX,0ABCHCWD;被除数扩展为DX:AX=00000ABCHMOVBX,0200HIDIVBX;AX←商0AH,DX←余数E5H《汇编语言程序设计及上机指导》第4章382022年11月24日星期四3.扩展传送指令M
OVSX/MOVZX指令格式:MOVSXREG16/REG32/REG64,REG8/MEM8/REG16/MEM16MOVZXREG16/REG32/REG64,REG8/MEM8/REG16/MEM16源操作数的长度小于目标操作数的长度
;若目标操作数是64位寄存器,则该指令只能用在64位方式下。MOVSX用于传送有符号数,并将符号位扩展到目标操作数的所有位;MOVZX用于传送无符号数,将0扩展到目标操作数的所有位。常用于作除法时对被除数位数的
扩展。【例3.30】MOVZXEAX,CX;将CX中16位数零扩展为32位送入EAXMOVSXRCX,AL;将AL内容符号扩展为64位送入RCX。《汇编语言程序设计及上机指导》第4章392022年11月24日星
期四四.BCD算术运算指令(1)非压缩BCD码加/减法调整指令AAA/AAS指令格式:加法调整指令AAA减法调整指令AAS功能:若(AL&0FH)>9或标志AF=1,则AL←AL±6AH←AH±1AF←1CF←AFAL←AL&0FH指令名称指令书
写格式状态标志位OFSFZFAFPFCF加法的ASCII码调整加法的十进制调整减法的ASCII码调整减法的十进制调整乘法的ASCII码调整除法的ASCII码调整AAADAAAASDASAAMAAD***Y***Y*YY
Y*Y*YYYYYYY*N*Y*YYY1YYY**0000011000010010(AL&0FH>9)∧00001111(AL与0FH)0000011000000010(62的BCD码)0000001000000111(27的BCD码)+0000001100000101(35的BCD码)0000
010100001100(AL&0FH>9)+00000001+00000110(AH+1,AL+6调整)《汇编语言程序设计及上机指导》第4章402022年11月24日星期四(2)压缩BCD码加减法调整指令DAA/DAS指令格式:加法调整指令DAA减法调整指令
DAS功能:若(AL&0FH)>9或AF=1,则AL←AL±6AF←1若AL>9FH或CF=1,则AL←AL±60HCF←1;【例3.31】AL=65H(十进制数65的BCD码),BH=47H(十进制数47的BCD码),用下列指令可得到这两个数和的正确结果。SUBAL,BH;AL←AL
–BH(AL的值为1EH)DAS;将AL的内容调整为18H《汇编语言程序设计及上机指导》第4章412022年11月24日星期四(3)非压缩BCD码乘除法调整指令AAM/AAD指令格式:乘法调整指令AAM除法调整指令AADAAM紧跟在MUL指令之后,能把在AX中的两个非压缩BC
D数相乘的结果进行调整,得到正确的非压缩BCD的乘积(高位在AH中,低位在AL中)。调整操作为:AH←AL/0AH;AH←AL被0AH除的商AL←AL%0AH;AL←AL被0AH除的余数AAD指令用来在进行两个非压
缩BCD数的除法运算之前,先调整AL和AH中的内容,再用二进制除法指令DIV相除。相除以后,以非压缩BCD数表示的商在AL中,而相应的余数在AH中。调整操作为:AL←AH×0AH+ALAH←0《汇编语言程序设计及上
机指导》第4章422022年11月24日星期四4.4逻辑运算与移位指令(1)逻辑非指令NOT指令格式:NOTreg/mem功能:将操作数按位取反送回。例:NOTEAX;若指令执行前(EAX)=66668888H,则指令执行后(EAX)=99997777H。一.逻辑运算
指令指令名称指令书写格式状态标志位OFSFZFAFPFCF‘非’NOT目标NNNNNN‘与’AND目标,源0YY*Y0‘或’OR目标,源0YY*Y0‘异或’XOR目标,源0YY*Y0‘测试’TEST目标,源0YY*Y0《汇编语言程序设计及上机指导
》第4章432022年11月24日星期四(2)逻辑与/或/异或指令指令格式:AND/OR/XORreg/mem,reg/imm/memreg功能:执行按位逻辑“与”、“或”和“异或”操作,两个操作数宽度必须相等,执行结果存入第一个操作数中。AND实现逻辑“与”操作:例:
ANDAL,0FH;AL的高4位被屏蔽,低4位被析取OR实现逻辑“或”操作:例:ORBX,0003H;BX寄存器的第0位和第1位置1XOR实现逻辑“异或”操作:例:XOREBX,00000001H;改变BX寄存器第0位的
状态《汇编语言程序设计及上机指导》第4章442022年11月24日星期四(3)测试指令TEST指令格式:TESTreg/mem,reg/mem/imm指令功能:与AND指令相同,但操作结果不送回目标操作数,即两个操
作数不变,只影响标志位。主要用于测试某一操作数的一位或几位的状态。例:若要检测AL中的最低位是否为1,为1则转移,可使用以下指令:TESTAL,01HJNZTHAT;ZF=0,则AL寄存器的第0位为1,转移到THAT…THAT:……《汇编语言程序设计及上机指导》第4章452022年
11月24日星期四二.移位和循环移位指令类别指令名称指令书写格式状态标志位OFSFZFAFPFCF移位逻辑左移SHL目标,计数值YYY*YY算术左移SAL目标,计数值YYY*YY逻辑右移SHR目标,计数值YYY*YY算术右移SAR目标,计数值YYY*YY多位左
移SHLDOPRD1,OPRD2,OPRD3YYY*YY多位右移SHRDOPRD1,OPRD2,OPRD3YYY*YY循环移位循环左移ROL目标,计数值YNN*NY循环右移ROR目标,计数值YNN*NY带进位循环左移RCL目标,计数值YNN*NY带进位循环右移RCR目标,计
数值YNN*NY《汇编语言程序设计及上机指导》第4章462022年11月24日星期四(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状态不定。SHLCF0SALCF0ROLCFRCLCFSHRCF0SARCFRORCFRCRCF《汇编语言程序设计及上机指导》第4章47这8条指令具有以下几个共同点:(1)DEST为操作对象,它可以是字节或字操作数,可以是通用寄存器或存储器操作数。(2)COUNT用来决定移位/循
环的位数,即确定移位的次数。当移位次数为1时,使用常数1或寄存器CL当移位次数大于1时,必须使用寄存器CL。《汇编语言程序设计及上机指导》第4章48这8条指令具有以下几个共同点:(3)在执行移位时,根据指令不同,每移位一次,最高位(左移
)或最低位(右移)都要送到进位标志CF。(4)前4条移位指令根据移位结束后修改标志位CF、PF、ZF、SF和OF,而AF不确定。而后4条循环移位指令根据移位结束后的结果仅修改CF和OF对溢出标志位OF的影响:移位次数为1时,移位前后操作数的符号位发生变化,则OF被置1,否则
置0。移位次数大于1时,OF不确定。《汇编语言程序设计及上机指导》第4章492022年11月24日星期四【例3.37】若AL中存有8位有符号数,现需要将其乘以16(2的4次方),结果存入AX中,则可用以下指令完成:【例3.38】下面的程序段可用来执行(RAX)*5
/2的运算(假设运算过程中没有超出64位)。CBW;将字节AL扩展到字AXSALAX,4(或SHLAX,4);AX←AX×16MOVRDX,RAX;RAX暂存于RDXSALRAX,2;RAX*4ADDRAX,RDX;5倍RAXSARRAX,1;RAX除以2《汇编语言程
序设计及上机指导》第4章502022年11月24日星期四(2)循环移位指令ROL/ROR/RCL/RCR具体指令为:ROL/ROR/RCL/RCRreg/mem,1/CL/imm8若有一个8字节数,它们或是存放在两个寄存器中(如EA
X和EDX中),或是存放在连续的内存单元中,则可用下面的指令来实现这个8字节数整个左移一位。SALEAX,1或:SALFIRST_DWORD,1RCLEDX,1RCLSECOND_DWORD,1《汇编语言程序设计及上机指导》第4章512022年11月2
4日星期四类别指令名称指令书写格式状态标志位OFSFZFAFPFCF基本串操作指令字节/字/双字串传送MOVS目标串,源串MOVSB/MOVSW/MOWSD/MOWSQNNNNNNNNNNNN字节/字/双字串比较CMPS目标串,源串CM
PSB/CMPSW/CMPSD/CMPSQYYYYYYYYYYYY字节/字/双字串搜索SCAS目标串,源串SCASB/SCASW/SCASD/SCASQYYYYYYYYYYYY读字节/字/双字串LODS目标串,源串LODSB/LODSW/LODSD/LODSQNNNNNNNNNNNN写
字节/字/双字串STOS目标串,源串STOSB/STOSW/STOSD/STOSQNNNNNNNNNNNN重复前缀无条件重复REPNNNNNN当相等/为零时重复REPE/RPZNNNNNN当不等/不为零时重复REPNE/PEPNZNNNNNN4.5串操作类指令《汇编语言程序设计及上机指导》
第4章522022年11月24日星期四1)约定以DS:SI寻址源串,以ES:DI寻址目标串,所以指令中不必显式指明操作数。其中源串的段寄存器DS可通过加段超越前缀而改变,但目标串的段寄存器ES不能超越。在32位处理器中,也可以用ESI和ED
I做为源和目的串的变址寄存器。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做为串重复次数寄存器。串操作指令共同点《汇编语言程序设计及上机指导》第4章532022年11月24日星期四一.重复前缀REP/REPE/REPNE/REPZ/REPNZ重复前缀不能单独使用,只能加在串操作指令之前,用来控制其后的基本串操作指令是否重复。1)在MOVS、LODS、S
TOS指令前加上前缀指令REP后,就按下列步骤不断地重复:①若CX=0,则退出REP操作;否则:②CX←CX-1③执行REP后面的数据串指令④重复①~③2)将REPE/REPZ加在CMPS或SCAS指令之前时,上述重复执行步骤①变为:①若CX=0或ZF=0,则停止重复
过程。3)将REPNE/REPNZ加在CMPS或SCAS指令之前时,上述重复执行步骤①变为:①若CX=0或ZF=1,停止重复过程。《汇编语言程序设计及上机指导》第4章542022年11月24日星期四二.基本串操作指令(1)串传送指令MOVS/MOVSB
/MOVSW/MOVSD/MOVSQ指令格式:MOVSOPRD1,OPRD2MOVSB;字节串传送MOVSW;字串传送MOVSD;双字串传送MOVSQ;4字串传送功能:把DS:SI指定的源串中的一个字节或字,传送至由ES:DI指定
的目标串。且根据方向标志DF自动地修改SI、DI,以指向串中的下一个元素。《汇编语言程序设计及上机指导》第4章552022年11月24日星期四例:将数据段内起始地址在SOURCE(段内偏移地址)的一数据块传送到附加段地址在DEST的存储单元中去,可用下面的程序段来实现(假设数据块长度=100字节
):LEASI,SOURCELEADI,DESTMOVCX,50;设置循环操作次数100/2CLD;设置方向标志DF=0GO_ON:MOVSWDECCXJNZGO_ON若采用重复前缀,则上述程序简化为:LEA
SI,SOURCELEADI,DESTMOVCX,50;设置循环操作次数CLD;设置方向标志DF=0REPMOVSW《汇编语言程序设计及上机指导》第4章562022年11月24日星期四(2)串比较指令CMPS/CMPSB/CMPSW/CMPSD/CMPSQ
指令格式:CMPSOPRD1,OPRD2CMPSB;字节串比较CMPSW;字串比较CMPSD;双字串比较CMPSQ;4字串比较功能:将DS:SI指定的源串中的元素减去由ES:DI指定的目标串中的相应元素,但两个存储单元中的内容不变,而是用标志位的变化表示比较结果,同时根据方向标志DF自动
修改源和目标串指针SI、DI。若CMPS指令前加上前缀REPE/REPZ,则表示:当串未结尾(CX≠0)且串相等(ZF=1)时继续比较;如果CMPS用REPNE/REPNZ作前缀,则表示:当串未结尾(CX≠0)且串不相等(ZF=0)时继续比较。《汇编语言程序设计及上
机指导》第4章572022年11月24日星期四例:比较两个字符串是否有相同的元素,它们的首地址和目标地址分别为SRC和DST,字符串的长度为N个字节。CLD;DF=0,增量方向LEASI,SRC;字符串首地址送DS:SILEADI,ES:DST;目标地址送ES:DIMOVCX,
N;字符串长度REPNECMPSB;重复比较字符串JNZNOT_FOUND;无相同的元素,转NOT_FOUND,否则继续执行下条指令„„NOT_FOUND:„„若两个字符串没有相同的元素,则串比较指令一直重复执行,直至
(CX)=0为止,并转入下一条条件转移指令JNZ,判断比较结果是否为0。显然,由于未找到相同的元素,因此比较结果非0,转NOT_FOUND执行。《汇编语言程序设计及上机指导》第4章582022年11月24日星期四(3)串搜索指令SCAS/SCASB/SCASW/SCASD/SCASQ指令
格式:SCASOPRDSCASB;搜索字节串SCASW;搜索字串SCASD;搜索双字串SCASQ;搜索4字串功能:将累加器(AL或AX)中的内容与ES:DI)指定的目标串元素(字节或字或双字或4字)进行
比较(减法操作),用标志位反映比较的结果,而不改变累加器和目标串的内容,达到字符串搜索的目的,同时自动修改指针DI。在SCAS指令前加有REPE/REPZ前缀,则表示:当串未结尾(CX≠0)且串元素=关键值(ZF=1)
时继续搜索。--用来搜索与给定关键值不同的内容。在SCAS指令前加有REPNE/REPNZ前缀,则表示:当串未结尾(CX≠0)且串元素≠关键值(ZF=0)时继续搜索,直到CX=0或ZF=1才执行下一条指令。--可以用来在一个串中查出某一指定元素
。《汇编语言程序设计及上机指导》第4章592022年11月24日星期四例:在首地址为ES:DST的字符串中检查是否有字符'M',字符串的长度为N个字节。CLD;DF=0,增量方向LEADI,ES:DST;目标地址送ES:DIMOVCX,N;字符串长度MOVAL,‘M’;搜索字符
送ALREPNESCASB;重复搜索字符串是否有字符'M'若字符串中没有字符‘M’,则串扫描指令一直重复执行,直至CX=0为止,并转入下一条指令继续执行。否则,将提前转入下一条指令继续执行。《汇编语言程序设计及上机指导》第4章602022年11月24日星
期四(4)串元素存取指令指令格式:STOS/LODSOPRDSTOSB/LODSB;存/取字节串STOSW/LODSW;存/取字串STOSD/LODSD;存/取双字串STOSQ/LODSQ;存/取4字串STOS将
累加器(AL或AX)的内容存入由ES:DI指定的目标串中去,同时自动修改DI。指令前可加重复前缀REP,以给一个内存块赋同一个值。LODS将DS:SI指定的源串中的元素,传送到AL(字节操作)或AX(字操作)寄存器中,同时自动修改SI。《汇编语言程序设计及上机指
导》第4章612022年11月24日星期四例:将首地址为DS:SRC的32位数据串中值为87654321H的元素送到首地址为ES:DST的内存区中。字符串长度为1000H字节。CLD;DF=0,增量方向LEAESI,SRC;字符串首地址送DS:SIL
EAEDI,ES:DST;目标地址送ES:DIMOVECX,400H;字符串长度1000H/4=400HCONTINUE:LODSD;取字符串的一个元素CMPEAX,87654321H;字符串元素为87654321H
吗?JNENEXT;不是,继续取下一个元素STOSD;是,存入首地址为ES:DST的内存区中NEXT:DECECXJNZCONTINUE利用DEC和JNZ指令控制串操作指令的重复执行次数。当(ECX)≠0时,程序重复循环,直至(ECX)=0为止。《汇编语言
程序设计及上机指导》第4章622022年11月24日星期四4.6控制转移类指令一.无条件转移指令JMP指令格式:JMP目标标号JMP指令有以下5种形式:(1)段内直接短转移:JMPSHORTlable功能:无条件地转移到lable所指定的目标地址。短(SH
ORT)转移时,目标地址与JMP指令的下一条指令地址之差在-128~127字节之间,即跳转地址的偏移范围为8位带符号二进制数范围,属于相对转移。(2)段内直接近转移:JMPNEARPTRlable功能:无条件转移到目标地址lable。跳转
地址的偏移范围为16位带符号二进制数的范围,即±32K,属于相对转移。(3)段内间接转移:JMPreg或JMPmem功能:无条件转移到由寄存器的内容指定的目标地址,或由寄存器间接寻址、基址变址、相对基址变址提供的存储单元内容所指定的目标地址,是一种绝对转移指
令。《汇编语言程序设计及上机指导》第4章632022年11月24日星期四例:MOVBX,1000HJMPBX;程序将转向1000H,即IP←1000HJMPWORDPTR[BX+20H]设DS=2000H,[21020H]=34H,[21021H]=12H,则第二个JMP将程
序转向1234H,即IP=1234H。(4)段间直接转移:JMPFARPTRlable功能:无条件转移到指定段内的目标地址lable,是绝对转移指令。例:CODE1SEGMENTCODE2SEGMENT……JMPFARPTRDESTDEST:………CODE1ENDSCODE2ENDS目标地址也可
直接用数值表达式给出,这时可省略FAR属性说明。JMPFARPTR2000H:0100H程序将转向段地址为2000H,偏移地址为0100H的单元《汇编语言程序设计及上机指导》第4章642022年11月24日星期四(5)段间间接转移:JMPmem功能:程序将转向由mem指定的双字指针中
第一个字单元的内容作为IP,第二个字单元的内容作为CS的目标地址。例:MOVSI,0100HJMPDWORDPTR[SI]把DS:[SI]即DS:0100H和DS:0101H两单元的字送IP,而把DS:0102H和DS:0103H两单元的字送CS。程序转入由新的CS和新的IP决
定的目标地址。在32位保护模式下,段内转移的目标地址为32位偏移地址,段间转移的目标地址为48位虚拟地址(16位段选择符:32偏移地址)。例:JMPEBX;段内转移,EIP=EBXJMPFWORDPTR[EBX];段间转移,目标地址为[EBX]指向的48位虚拟地址,;
CS=其中的高16位,EIP=其中的低32位《汇编语言程序设计及上机指导》第4章652022年11月24日星期四在64位模式下,指令指针为RIP。JMP指令的执行分为相对转移和绝对转移两种情况:若为相对转移,则用RIP寄存器与机器码中的位
移量字段相加的和修改RIP值,此时位移量字段不能超过32位,并将其符号扩展为64位再相加;若为绝对转移,则把机器码中指出的寄存器或内存单元的值直接填入RIP(若不足64位将进行0扩展),实现64位地址空间的转移。【例】JMP30000H;若原来RIP=20000H,则将RIP加10000H
,实现相对转移JMPR15;程序将转向R15指向的地址,即RIP←R15,实现绝对转移《汇编语言程序设计及上机指导》第4章662022年11月24日星期四二.条件转移类指令(1)根据单个标志位的条件转移指令JCTAB1;当(AX-BX)有借位时,转至TAB1。C
MPCX,DXJNETAB2;当CX≠DX(即CX-DX≠0)时,转至TAB2。指令名称说明助记符测试条件等于/结果为零转移相等/等于零JE/JZ目标标号ZF=1不等于/结果不为零转移不相等/不等于零JNE/JNZ目标标号ZF=0有进位/有借位转移有进位/借位JC目标标号CF=1无
进位/无借位转移无进位/借位JNC目标标号CF=0溢出转移有溢出JO目标标号OF=1不溢出转移无溢出JNO目标标号OF=1奇偶性为1/为偶转移有偶数个“1”JP/JPE目标标号PF=1奇偶性为0/为奇转移有奇数个“1”JNP/JPO目标标号PF=0符号位为1转移是负数JS目标标号SF=1符号位为0
转移是正数JNS目标标号SF=0《汇编语言程序设计及上机指导》第4章672022年11月24日星期四(2)用于无符号数比较的条件转移指令表3.9中的11~14条指令,检测无符号数比较结果的特征标志CF和ZF。例:比较无符号数FE
H和01H的大小,执行下面的指令后,将转移到ABOVE处继续执行指令。MOVAL,0FEHCMPAL,01HJAABOVE……ABOVE:……指令名称说明助记符测试条件高于/不低于也不等于转移无符号数A>BJA/JNBE目标标号CF=0且ZF=0高于或等于/不低于转移无符号数A≥
BJAE/JNB目标标号CF=0低于/不高于也不等于转移无符号数A<BJB/JNAE目标标号CF=1低于或等于/不高于转移无符号数A≤BJBE/JNA目标标号CF=1或ZF=1《汇编语言程序设计及上机指导》第4章682022年11月24日星期四(3)用于有符号数比较的条件转移指令表3.9中的
最后四条指令检测的是SF、OF以及ZF标志,表示两个有符号数间的大小关系。例:比较有符号数FEH和01H的大小,下面的指令,将不转移到greater,而是继续执行JG下面的一条指令,因为有符号数0FEH<01H。MOVAL,0FEHCMPAL,01HJGGR
EATER指令名称说明助记符测试条件大于/不小于也不等于转移有符号数A>BJG/JNLE目标标号SF⊕OF=0且ZF=0大于或等于/不小于转移有符号数A≥BJGE/JNL目标标号SF⊕OF=0或ZF=1小于/在大于也不等于转移有符号数
A<BJL/JNGE目标标号SF⊕OF=1且ZF=0小于或等于/不大于转移有符号数A≤BJLE/JNG目标标号SF⊕OF=1或ZF=1《汇编语言程序设计及上机指导》第4章692022年11月24日星期四三.调用与返回指令1.调用指令CALL指令
格式:CALLOPRD用于调用子程序(或过程)OPRD,它和JMP指令相似。⑴段内直接调用操作:PUSHIP;IP入栈(IP)←(IP)+16位位移量;转向子程序入口《汇编语言程序设计及上机指导》第4章702022年11月24日星
期四⑵段内间接调用(CALLNEARPTRDST)操作:PUSHIP;IP入栈(IP)←(EA);转向子程序入口----IP的值不是CALL指令的下一条指令地址加上16位位移量,而是直接将DST的有效地址送入
IP,这是一种绝对调用指令。例:CALLBX;EA在BX中CALLWORDPTR[BX];EA在字存储单元中《汇编语言程序设计及上机指导》第4章712022年11月24日星期四⑶段间直接调用(CALLFARPTRDST)操作:PUSHCS;CS入栈PUSHIP;IP入栈(IP)←偏移地址
;IP由指令中的偏移地址取代(CS)←段地址;CS由指令中的段地址取代其一:调用时不仅要保护偏移地址,而且要保护段地址,先CS压栈,然后IP压栈;其二:CS和IP的值不是用CALL指令的下一条指令地址加上位移量取代,而是直接将DST的段地址和偏移地址送入CS:IP,是一种绝
对调用指令。例:CALL1000H:0100HCALLFARPTRSUB_PROC《汇编语言程序设计及上机指导》第4章722022年11月24日星期四⑷段间间接调用(CALLFARPTRDST)操作:PUSHCS;CS入栈PUSHIP;IP入栈(IP)←(EA);IP由指令中的
偏移地址取代(CS)←(EA+2);CS由指令中的段地址取代是绝对调用指令,根据寻址方式求出EA后,把指定存储单元的字内容送到IP,下一个字的内容送到CS。《汇编语言程序设计及上机指导》第4章732022年11月24日星期四2.返回指令RET指令
格式:RET或RETimm16用以返回到调用这个子程序的断点处,作为子程序或过程的最后一条指令,。若是段内返回,则把栈顶的一个字弹出至IP,恢复调用时断点处的偏移地址;若为段间返回,则除了弹出IP外,还要从当前栈顶继续弹出一个字到CS,恢复断点处
的段地址。《汇编语言程序设计及上机指导》第4章742022年11月24日星期四(2)RETimm16指令带立即数的返回指令,中的16位立即数称为弹出值,RET指令在完成返回操作后,还须作SP←SP+imm16,即删除栈中imm16个字节的内容。例:下列程序段表示由
于在RET指令中规定了弹出值,使控制从子程序返回后栈顶位置恢复到正常状态。;主程序MOVAX,N1;子程序APUSHAXPROG_APROCNEARMOVAX,N2…PUSHAXRET4CALLPROG_APROC_AENDPMOVSUM,AX《汇编语言程序
设计及上机指导》第4章752022年11月24日星期四在32位模式下对于CALL指令,段内调用的目标地址为32位偏移地址,段间调用的目标地址为48位虚拟地址。若是段内调用,则将EIP的值进栈;若是段间调用,则先将CS的值零扩展为双字后再进栈,然后将EI
P的值进栈,总共进栈8个字节。对于RET指令段内返回时弹出栈顶的4个字节到EIP;段间返回时先弹出栈顶的4个字节到EIP,然后再弹出4个字节,其中的低16位进入到CS。《汇编语言程序设计及上机指导》第4章7620
22年11月24日星期四在64位模式下CALL/RET指令对RIP寄存器执行入栈和弹出操作。对于NEAR类型的CALL指令有两种实现方式:一种是可以通过32位位移量实现相对转移,完成调用功能;另一种方
法是通过指令给出的64位存储器或寄存器内容修改RIP,实现绝对转移而完成调用功能。对于FAR类型的CALL指令,只能通过内存单元内容间接访问相应的段描述符,若描述符中的选择子指向了调用门,就从调用门中获得64位目标地址,否则把当
前指令指出的内存单元作为64位目标地址,完成调用功能。绝对转移《汇编语言程序设计及上机指导》第4章772022年11月24日星期四四.循环控制指令指令格式:LOOP目标地址LOOPE/LOOPZ目标地址LOOPNE
/LOOPNZ目标地址JCXZ目标地址除JCXZ指令外,其余指令都是先使CX内容减1,然后依据CX中的值是否为0来决定是否终止循环。注意:LOOPZ/LOOPE指令:使CX-1→CX,若CX≠0且ZF=1,则循环转移至目标标号;否则(CX=0或ZF=
0),顺序执行LOOPZ/LOOPE后面的指令。LOOPNZ/LOOPNE同LOOPZ/LOOPE指令类似,只不过转移条件是CX≠0且ZF=0。JCXZ指令不影响CX的内容,此指令仅在CX=0时,控制转移到目标标号,否则顺序执行JCXZ的下一条指令。《汇编语言程序设计及上机指导》
第4章782022年11月24日星期四例:检查当前数据段所在的64K字节内存是否能够正确地进行读写操作。可以先向每个字节写入数据10101010B,然后读出来进行比较。若正确则转至目标标号OK的程序段,否则进入出错处理程序段ERROR。程序如下:MOVCX,0000HMOVBX,0000HMOV
AL,10101010BAGAIN:MOVBYTEPTR[BX],ALINCBXCMPBYTEPRT[BX-1],ALLOOPZALAINJCXZOKERROR:…;出错处理…OK:…;读写正确当程序执行JCXZ指令时,可能有两种情况:①CX=0,这表
示所有单元的读写都正确;②CX≠0,但ZF=0,表示检查到某一单元时,写入与读出不一致,即出错。于是JCXZ指令根据CX寄存器内容是否为0(为0表示正确,不为0表示出错)使程序发生分支,进入不同的程序段。《汇编语言程序设计及上机指导》第4章792022年11月
24日星期四五.中断指令(1)中断指令INT/INTO指令格式:INTimm8INTO功能:INTimm8:用于产生一个由8位立即数指定中断号的内部中断。该指令首先将标志寄存器FLAG和断点地址(CS和IP)进栈,
并将标志位TF和IF清零,然后转向指定中断号的中断服务程序。系统中最多可用256条这样的中断指令INTO:为溢出中断指令,是内部中断指令INT的特例,中断号隐含为4。它只有当某运算结果使OF置1时才产生中断。指令名称指令助记符中断INT中
断类型溢出时中断INTO中断返回IRET《汇编语言程序设计及上机指导》第4章802022年11月24日星期四(2)中断返回指令IRET指令格式:IRET----所有的中断过程,最后一条指令必须是IRET,用以退出中断过
程,返回到中断时的断点处。操作:从堆栈中弹出原进栈保护的IP、CS和标志寄存器FLAG值,继续被中断程序的执行。注意:在32位保护模式下,对于INT指令,依次进栈的是EFLAG、CS、EIP,其中CS零扩展为双字后进栈,总共12个字节。IRET指令弹出栈顶12个字节,按相反
的顺序依次恢复EIP、CS、EFLAG。在32位模式和64位模式下,还分别可以使用IRETD、IRETQ完成中断返回,功能与IRET指令类似。《汇编语言程序设计及上机指导》第4章812022年11月24日星期四4.7处理器控制类指令一.标志位操作指令(1)CLC/STC/CMCCL
C和STC指令使进位标志CF置为0或1,CMC使标志CF取反。(2)CLD/STD将方向标志DF置为0或1,以控制串操作指令执行时SI和DI是增量或减量。(3)CLI/STI将中断标志IF置为0或1,以控制CPU是否响应可屏蔽中断IN
TR引线上出现的外部中断请求。CLI禁止CPU响应,而STI指令允许CPU响应。指令名称助记符进位标志置1STC进位标志复位CLC进位标志取反CMC方向标志置1STD方向标志复位CLD中断标志置1STI中断标志复位CLI《汇编语言程序设计及上机指导》第4章822022年1
1月24日星期四二.处理器协调类指令作用是实现CPU与外部事件的同步。(1)处理器暂停指令HLT作用:使程序停止执行,处理器进入暂停状态。它不影响任何标志。只有当以下三种情况之一发生,才能使CPU结束暂停状态:在
CPU的RESET线上有复位信号;在CPU的NMI线上有请求;在中断允许情况下(即标志IF=1),CPU的INTR线上有请求。所以,HLT指令常在程序中用于等待中断。当因中断使CPU脱离暂停而去执行中断服务程序时,中断保护的断点CS:IP值应指向HLT指令的
下一条指令。指令名称助记符停机HLT等待WAIT封锁总线LOCK空操作NOP《汇编语言程序设计及上机指导》第4章832022年11月24日星期四(2)处理器等待指令WAIT功能:主要用来使CPU与外部硬件同步,它对标志无影响。(3)总线锁定前缀
LOCKLOCK是一个单字节的前缀,它可以加在任何指令前面,使CPU在执行这条指令期间保持输出引线LOCK有效。作用:在多处理器系统中,可以用这个前缀来对共享资源进行强迫控制,即在CPU执行该条指令时,使其它微处理器不能通过总线访问存储器等。此指令对任何标志
无影响。《汇编语言程序设计及上机指导》第4章842022年11月24日星期四(4)空操作指令NOP作用:使CPU完成一次空操作。它仅使指令指针IP加1,不作任何其它操作。注意:和HLT指令不同,NOP指令执行后,CPU继续执行其后的指令。NOP指令也不影响任何标志。在3
2/64位系统中,上述4条指令功能没有扩展,保持和16位8086基本一样。《汇编语言程序设计及上机指导》第4章852022年11月24日星期四4.8其他指令类别指令格式功能说明高级语言类BOUNDreg16/
reg32,memENTERimm16,imm8LEAVE边界检测建立堆栈空间释放堆栈空间保护模式的系统控制类指令LARreg16/reg32,reg16/mem16LSLreg16/reg32,reg16/mem16LG
DTmem16/mem32SGDTmem16/mem32LIDTmem16/mem32SIDTmem16/mem32LLDTreg16/mem16SLDTreg16/mem16LTRreg16/mem16STRreg16/mem16LMSWreg16/m
em16SMSWreg16/mem16VERRreg16/mem16VERWreg16/mem16ARPLreg16/mem16,reg16CLTS取访问权限取段界限装入全局描述符表GDTR存储全局描述符表GDTR装入8字节中断描述符表IDTR存储8字节中断描述符表装
入局部描述符表LDTR存储局部描述符表LDTR装入任务寄存器TR存储任务寄存器TR装入机器状态字MSW存储机器状态字MSW验证操作数满足特权规则且是可读的验证操作数满足特权规则且是可写的调整操作数的请求特权层清除任务转移标志《汇编语言程序设计及上机指导》第4章862022年11月24日星期四
1.高级语言类指令有三条:⑴边界检测指令BOUNDreg16/reg32,mem作用:检查一个值是否在指定的内存范围内,常用于确定一个有符号的下标值,以便知道它是否在一个数组范围内,若不在(即下标出界),则产生INT5异常中断。其中第一个操作数可以是一个16位或32位寄存器;mem可以是32位内存
变量,它定义了两个操作数,第一个规定下界,第二个规定上界。例:BOTTOMEQU0TOPEQU20DBOUNDLABELDWORDWBOUNDDWBOTTOM,TOPARRAYDBTOPDUP(?)BOUNDDI,DBOUNDMOVDX,ARRAY[DI]上面的例子中,假设DI是数组地
址指针,BOUND指令的作用是检查DI是否在数组地址范围内。若在此范围内,则将该地址的数送Dx寄存器,否则发INT5异常中断。《汇编语言程序设计及上机指导》第4章872022年11月24日星期四⑵设置与撤消堆栈空间的指令程序(或函数)都有自己的局部变量,为保护这些局
部变量,当执行到所在的子程序时,应为其局部变量建立相应的堆栈区;而在退出子程序时,应撤除这个堆栈区。为此,80286增加了以下两条指令:①ENTERimm16,imm8功能:为过程参数建立一个堆栈区,imm16指出过程所需要的堆栈字节数,imm8指出过程的嵌套层数(0~31)。②LE
AVE功能:撤消前面ENTER指令建立的堆栈区,无操作数。例:TASKPROCFARENTER8,0;建立堆栈区并保存8个字节长的局部变量…LEAVE;撤消建立的堆栈区RETTASKENDP《汇编语言程序设计及上机
指导》第4章882022年11月24日星期四保护模式的系统控制类指令指令格式功能说明LARreg16/reg32/reg64,reg32/reg16/mem16LSLreg16/reg32/reg64,reg32/reg16/mem16LGDTmem16&mem32/mem16&
mem64SGDTmemLIDTmem16&mem32/mem16&mem64SIDTmemLLDTreg/mem16SLDTreg/mem16LTRreg/mem16STRreg/mem16LMSWreg/mem16SMSWreg/mem16VERRr
eg/mem16VERWreg/mem16ARPLreg/mem16,reg16CLTS取访问权限取段界限装入全局描述符表GDTR存储全局描述符表GDTR装入8字节中断描述符表IDTR存储8字节中断描述符表装入局部描述符表LDTR存储局部描述符表LDTR装入任
务寄存器TR存储任务寄存器TR装入机器状态字MSW存储机器状态字MSW验证操作数满足特权规则且是可读的验证操作数满足特权规则且是可写的调整操作数的请求特权层清除任务转移标志《汇编语言程序设计及上机指导》第4章892022年11月24日
星期四二.条件设置指令指令格式功能说明SETOreg8/mem8若OF=1,则1→r/m;否则0→r/mSETNOreg8/mem8若OF=0,则1→r/m;否则0→r/mSETC/SETB/SETNAEreg8/mem8若CF=1,则1→r/m;否则0→r/mSETNC/SETNB
/SETAEreg8/mem8若CF=0,则1→r/m;否则0→r/mSETZ/SETEreg8/mem8若ZF=1,则1→r/m;否则0→r/mSETNZ/SETNEreg8/mem8若ZF=0,则1→r/m;否则
0→r/mSETSreg8/mem8若SF=1,则1→r/m;否则0→r/mSETNSreg8/mem8若SF=0,则1→r/m;否则0→r/mSETP/SETPEreg8/mem8若PF=1,则1→r/m;否则0→r/mSETNP/SETPOreg8/mem8若PF=0,则1→
r/m;否则0→r/mSETBE/SETNAreg8/mem8若(CF∨ZF)=1,则1→r/m;否则0→r/mSETNBE/SETAreg8/mem8若(CF∧ZF)=0,则1→r/m;否则0→r/mSETL/SETNGEreg8/mem
8若(SF⊙OF=1)∧ZF=0,则1→r/m;否则0→r/mSETNL/SETGEreg8/mem8若(SF⊙OF=0)∨ZF=1,则1→r/m;否则0→r/mSETLE/SETNGreg8/mem8若(SF⊙OF=1)∨ZF=1,则1→
r/m;否则0→r/mSETNLE/SETGreg8/mem8若(SF⊙OF=0)∧ZF=0,则1→r/m;否则0→r/m《汇编语言程序设计及上机指导》第4章902022年11月24日星期四三.位操作指令1.测试与置位指令(1)BTdest,sr
c把目的操作数dest中由源操作数src指定的位送到CF中。(2)BTSdest,src把dest中由src指定的位送到CF中,然后将该位置1。(3)BTRdest,src把dest中由src指定的位送到CF中,然后将该位清0。(4)BTCdest,src把dest中由s
rc指定的位送到CF中,然后将该位取反。目的操作数只能是16/32/64位通用寄存器或存储单元,用于指定要测试的数据;源操作数必须是8位立即数或者是与目的操作数等长的16/32/64位通用寄存器,用于指定要测试的位号。----如果
目的操作数是寄存器,则源操作数除以16/32/64的余数就是要测试的位,它在0~15/31/63之间。例:MOVEAX,12345678H;EAX=12345678HBTSAX,7;(AX)的位7→CF,1→AX的位7,
EAX=123456F8HBTCEAX,2;(EAX)的位2→CF,EAX的位2取反,EAX=123456FCH----如果目的操作数是存储单元,则该单元的最低位为0位,从这个最低位向地址高端每位依次增量,向地址低端每位依次减量,此时有符号源操作数就指示要测试的位。例:BI
TSDW1234H,5678HMOVCX,22;CX=22BTRBITS,CX;[BITS+2]的位6→CF,再将该位清零,[BITS+2]=5638H《汇编语言程序设计及上机指导》第4章912022年11月24日星期四2.位扫描指令(1)向前扫描指令指令格式:BSF
reg,reg/mem用于对源操作数从低位b0到高位(b15或b31或b63)进行扫描,并将扫描到的第1个“1”的位号送入目标操作数指定的目标寄存器。如果源操作数全0,则ZF=1,目标操作数中的结果无定义;否则,将ZF=0。(2)向后扫描指令指令格式:BSRreg,reg/memBSR指令的功能
同BSF,只是从高位到低位进行反向扫描。例:MOVBX,40A0HBSFAX,BX;指令执行后,AX=5,ZF=0BSRAX,BX;指令执行后,AX=14,ZF=0《汇编语言程序设计及上机指导》第4章922022年
11月24日星期四四.特殊功能实用指令(1)CPU标识指令CPUID:辨别微机中奔腾处理器的类型和特点(2)读时间标记计数器指令RDTSC:读出时间标记计数器的值,送入寄存器EDX:EAX中,EDX保存64位计数器中的高32位,EAX保存低32位。(3)读/写模
式专用寄存器指令RDMSR/WRMSR(4)恢复系统管理模式指令RSM(5)寄存器与CR4之间的传送指令MOVCR4,reg32MOVreg32,CR4(6)读性能监控计数器指令RDPMC