汇编语言程序设计及上机指导第4章指令系统.ppt
《汇编语言程序设计及上机指导第4章指令系统.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计及上机指导第4章指令系统.ppt(90页珍藏版)》请在三一办公上搜索。
1、第4章 指令系统,【本章提要】本章重点讲述IA-32系列CPU的常用指令,和支持EM64T技术的高级Pentium4以及Core系列CPU的Intel64指令系统。【学习目标】熟练掌握汇编语言各种指令的功能和操作数在内存的存放规 律 掌握各种指令对操作数和寻址方式的特殊要求,明确不同指 令对标志寄存器的具体影响等方面 熟悉CPU内部各寄存器的使用规则及其在指令执行过程中的 隐含约定,2023/11/3,指令系统是CPU所能执行的各种指令的集合,定义了计算机硬件所能完成的基本操作,不同的CPU有不同的指令系统。8086/8088CPU的指令系统是基本指令集,80X86、PentiumX以及Cor
2、e2系列的指令系统保留了基本指令集,又进行了扩充。,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 数据传送类指令,通用数据传送堆栈操作地址传送
3、标志位传送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指令操作数要求,注
4、意:立即数和段寄存器CS不能作为目标操作数;立即数不能直接传送到段寄存器;两个存储单元之间不能直接传送数据;两个段寄存器之间不能直接传送数据;两个操作数宽度必须一致。,2023/11/3,(2)交换指令XCHG,指令格式:XCHGOPRD1,OPRD2功能:将OPRD1与OPRD2进行交换。二者都是源操作数也都是目的操作数。操作数可以是寄存器或内存数变量。【例】MOVEAX,12345678H;EAX12345678H MOVEBX,56781234H;EBX56781234H XCHGEAX,EBX;交换后,EAX56781234H,EBX12345678H XCHG R8,100;R8寄存
5、器内容与内存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位通用寄存器中的
6、双字以字节为单位进行高、低字节交换,改变双字数据的存放方式。指令执行时,字节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位的源操作数压
7、入堆栈 源操作数可以是通用寄存器、段寄存器和存储器,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指令将栈顶内容弹出,顺序与
8、压入的相反(弹出 到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 功能:将源操作数在当前段内的有效地址(即地址偏移量)传送至目标操作
9、数。区别: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位地址
10、的低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,T
11、AB2;将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)标志寄存
12、器读写指令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与堆栈之间的传送。PUSHF
13、Q指令和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中,
14、还可以通过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指
15、明,指令功能和用法不变,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,re
16、g/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(高
17、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/D
18、EC指令都是可以使用的。但是单字节编码的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 PT
19、R 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,则OPRD1OPRD
20、2;若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;否则,EAXE
21、CX,且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 功能:分别用于实现无符号数的乘法和有符号数的乘法运算。它们都只有一个源操作数,可以是寄存器或存
22、储器,而目标操作数隐含规定在累加器中。,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型中断(即除法出错中断),商和余
23、数的值不能确定。,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功能:用第二个操
24、作数乘以第三个操作数,返回的积存放在操作数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;RAXRAXRBX123
25、45678H,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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 上机 指导 指令系统
链接地址:https://www.31ppt.com/p-6475885.html