1 / 106

第 4 章 指令系统

第 4 章 指令系统. 4.1 概述. 指令系统 计算机所能执行的命令的集合。 包括操作码,操作数。 操作码 计算机完成何种操作。 操作数 参加操作的对象或其所在的地址。 机器指令 由二进制表示,计算机能识别的代码。 汇编指令 用助记符表示,能看懂的代码。. 一、指令系统概念和指令组成 1 、指令系统概念 计算机通过执行指令序列来解决问题 , 每种计算机都有一组 指令集提供用户使用 , 这组指令集就称为计算机的指令系统。 2 、指令组成 计算机中指令由操作码字段和操作数字段两部分组成。

leoma
Télécharger la présentation

第 4 章 指令系统

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第4章 指令系统 4.1 概述 指令系统 计算机所能执行的命令的集合。 包括操作码,操作数。 操作码 计算机完成何种操作。 操作数 参加操作的对象或其所在的地址。 机器指令 由二进制表示,计算机能识别的代码。 汇编指令 用助记符表示,能看懂的代码。

  2. 一、指令系统概念和指令组成 1、指令系统概念 计算机通过执行指令序列来解决问题,每种计算机都有一组 指令集提供用户使用, 这组指令集就称为计算机的指令系统。 2、指令组成 计算机中指令由操作码字段和操作数字段两部分组成。 一条可以由1~7个字节组成。 操作码字段:指示计算机要执行的操作, 操作数字段:指出在指令执行操作过程中所需要的操作数; 可以是操作数本身; 可以是操作数地址或是地址的一部分; 可以是指向操作数地址的指针或其他有关 操 作数的信息。

  3. 3、指令的一般格式: 操作码字段: 在机器里只需对某种操作指定确定的二进制代码。 通常用指令的第一个字节表示,不够可以占第二个字节中的3位。 操作数字段: 操作数字段可以有一个,二个或三个地址指令。 例: INC CX ADD AX , BX 书写格式: 【标号:】操作码助记符 【操作数助记符】【 ;注释】

  4. 4、操作数的存放 操作数的存放不外乎三种情况: (1) 操作数包含在指令中 即指令的操作数字段包含操作数本身。这种操作数为立即数。 例:MOV AL , 08H (2)操作数包含在CPU的一个内部寄存器中 例:INC CX 指令中的操作数字段是CPU内部寄存器的一个编码。 这种寻址方式称为寄存器寻址。

  5. (3)操作数在内存数据区 操作数在内存数据区,操作数字段包含着此操作数地址。 在80x86中,任何内存地址是由两部分组成: 段的基地址:单元所在段的基地址 (大部分情况是数据段寄存器DS中); 段内偏移量:此单元与段基地址的距离。 有效地址EA(Effective Address) : 段内偏移量为适应各种数据结构的需要,可以有几个部分组成,所以也把它称为有效地址EA。

  6. 4.2 80486的寻址方式 (一)立即寻址(Immediate addressing)P33 操作数直接存放在指令中,紧跟在操作码之后,作为指令 的一部分,存放在代码段里,这种操作数称为立即数。 立即数可以是8位或16位的。16位的立即数是高位字节放在高地 址,低位字节放在低地址。 使用场合:经常用于给寄存器赋初值。 注意:只能用于源操作数字段,不能用于目的操作数字段。 规定立即数以数字开头,以字母开头的数必须以数字0做前缀;编译时,立即数一律编译成二进制数,负数成补码,字符成ASCII码

  7. 例: MOV AL,05H 指令执行后: (AL)=05H 例: MOV AX,3064H 指令执行后: (AX)=3064H 立即寻址方式

  8. 4.2.2 寄存器寻址方式 (Register addressing) 操作数在寄存器中,指令指定寄存器号。 对于16位操作数,寄存器可以是: AX,BX,CX,DX,SI,DI,SP,BP。 以及段寄存器。 对于8位操作数,寄存器可以是: AL,AH,BL,BH,CL,CH,DL,DH。 这种寻址方式因为操作数在寄存器中 不需要访问存储器的运算速度较高。

  9. 4.2.3 存储器操作数的寻址方式 1. 直接寻址(Direct addressing) 操作数地址的16位偏移量,直接包含在指令中, 存放在代码段中指令操作码之后, 但操作数一般存放在数据段中, 必须先求出操作数的物理地址, 然后再访问存储器才能取得操作数。 或(10H) 物理地址 : PA=16d×(DS)+EA IBM PC机允许数据存放在数据段以外的其它段中。此时应在指令中指定段跨越(可以是CS,SS,ES)。

  10. 例:MOV AX,[3100H] (DS)=6000H , (63100H)=3050H 则:(AX)=3050H 又如:用符号地址代替数值地址。 MOV AX,VALUE 或 MOV AX,[VALUE] VALUE——有效操作数单元的 符号地址。 如:VALUE在附加段中, 则应指定段跨越。 MOV AX,ES:VALUE 或MOV AX,ES:[VALUE] 直接寻址方式

  11. 2. 寄存器间接寻址方式(Register indirect addressing) 操作数存储在存储器中, 操作数地址的16位偏移量存放在: BP、BX、SI、DI寄存器中。 (1) 若选择SI、DI、BX作为间接寻址 操作数一般在现行数据段区域中,用(DS)作为段地址。 即操作数物理地址为: 物理地址PA=16 d ×(DS)+(BX) 物理地址PA=16 d × (DS)+(SI) 物理地址PA=16 d × (DS)+(DI)

  12. 例:MOV BX,[DI] (DS)=6000H (DI)=2000H PA=62000H (62000H)=50A0H (BX)=50A0H 寄存器间接寻址方式 MOV BX,[DI]

  13. (2) 若选择BP寄存器作为间接寻址 操作数在堆栈段区域中,用SS寄存器的内容作为段地址。 操作数物理地址: PA=16d × (SS)+(BP) 例: MOV [BP], AX 执行前: (SS)=1000H , (BP)=3000H , (AX)=1234H 执行后:PA=13000H (13000H)=1234H 寄存器间接寻址方式 MOV [BP], AX

  14. (3) 用 SI、DI、BX 、BP作为间接寻址允许段跨越 指令中可以指定段超越前缀来取得其他段中的数据。 例:MOV ES:[DI], AX MOV DX, DS:[BP] 这种寻址方法可以用于表格处理。 (4)可以使用EBP,ESP间接寻址或者EAX~EDX,EDI这8个32位的寄存器做间接寻址寄存器,规定:ESP,EBP访问堆栈段,其他为数据段。 3. 基址寻址 在这种方式中,存储单元的有效地址为规定的基址寄存器的内容与一个常量之和。在指令中,地址表达式写成: 段寄存器:[基址寄存器+位移量] 段寄存器:位移量[基址寄存器]

  15. 80486规定可以作为基址寄存器的有: (1)BP,BX。使用BP进行基址寄存器寻址,约定访问的是堆栈段;使用BX进行基址寻址,约定访问的是数据段。 (2)EBP,ESP,EAX~EDX,ESI,EDI这8个32位的寄存器作基址寄存器。若使用EBP,ESP进行基址寻址,约定访问的是堆栈段;若使用EAX~EDX,ESI,EDI进行基址寻址,约定访问的是数据段。 4. 变址寻址 变址寻址有两种方式: (1)有比例因子的变址寻址。 形式为:段寄存器:[比例因子×变址寄存器+位移量] 规定EBP访问的是堆栈段,其他7个为数据段。 (2)没有比例因子的变址寻址(变址寄存器只能为SI,DI)。

  16. 5. 基址加变址寻址方式 (Based indexed addressing) 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,基址寄存器名和变址寄存器名均有指令指定。 (1)有比例因子的基址加变址寻址。格式如下: 段寄存器:[基址寄存器+比例因子×变址寄存器+位移量] 或段寄存器:位移量[基址寄存器+比例因子×变址寄存器] 或段寄存器:位移量[基址寄存器][比例因子×变址寄存器] 注意:基址寄存器和变址寄存器都必须是规定的32位寄存器

  17. (2)没有比例因子的基址加变址寻址。格式如下:(2)没有比例因子的基址加变址寻址。格式如下: 段寄存器:[基址寄存器+变址寄存器+位移量] 或段寄存器:位移量[基址寄存器+变址寄存器] 或段寄存器:位移量[基址寄存器][变址寄存器] 注意:基址寄存器和变址寄存器都必须是规定的16位寄存器

  18. 除有段跨越前缀之外,形成物理地址有二种方式:除有段跨越前缀之外,形成物理地址有二种方式:

  19. 间接寻址寄存器 基址寻址寄存器 变址寄存器 约定访问的逻辑段 BP BP 堆栈段 BX,SI,DI BX SI,DI 数据段 EBP,ESP EBP,ESP EBP 堆栈段 EAX,EBX ECX,EDX ESI,EDI EAX,EBX ECX,EDX ESI,EDI EAX,EBX ECX,EDX ESI,EDI 数据段 4.2.4 80486寻址方式的段约定和段超越

  20. 4.3 80486的标志寄存器 (六)标志寄存器 程序有时需根据上次指令执行的结果,判断以决定执行的方向,为此80486微处理器设有一标志寄存器,如下图所示。它是32位寄存器,实际使用15位,共14个标志。 1.状态标志 CF 第0位,进位标志。如果算术指令执行完后,最高位产生进位或借位,则CF=1,否则CF=0。CF还可保存移位或循环移位时移出的一位值,也可给出比较操作的结果,也可作为乘法结果的指示器。

  21. PF 第2位,校验标志。当操作结果含有偶数个1时,PF=1,否则PF=0,这个标志多用于数据输中。 AF 第4位,辅助进位标志。当操作数第3位产生进位或借位时,AF=1,否则AF=0,这个标志多用于压缩的十进制数操作。 ZF 第6位,零标志。当运算结果为零时,ZF=1,结果非零,则ZF=0 SF 第7位,符号标志。对带符号的数操作时,若产生一个负的结果,则SF=1,否则为0,当算术、逻辑、移位或循环移位操作时,都将影响此位。 OF 第11位,溢出标志。当带符号数算术运算时,商位溢出,则OF=1,否则为0,它用来作错误指示标志。

  22. 2 控制标志位 DF 第10位,方向标志。可用指令预置。当DF=0时,执行串操作指令后,变址寄存器自动递增,当DF=1时,则动递减。即该标志可控制地址朝增加的方向或减少的方向改变。 3 系统标志 TF 第8位,陷阱标志。当置为1时,则8088处于单步执行指令方式,每执行一条指令,自产动产生陷阱。 IF 第9位,中断允许标志。当用指令置为1时,则允许8088响应中为请求,若为0时,则禁止响应中断请求。 IOPL 第12,13位,I/O特权级标志。表示0级~3级4个I/O特权级,0级为最高级,3为最低级,该标志用于保护模式下的输入/输出操作。

  23. NT 第14位,任务嵌套标志。该标志仅用于保护模式。在保护模式下,如果当前执行的A任务是嵌套于B任务之中的,则NT标志置1。 R 第16位,恢复标志。当CPU响应“断点异常中断”时,R标志置1。 VM 第17位,虚拟标志。如果CPU工作在保护模式而VM又被置成1,则CPU就转换成虚拟86操作模式。 AC 第18位,对准检查标志。若AC标志为1,且CR0寄存器的AM位也为1,则进行字、双字或4字的对准检查。

  24. 4.4 80486的基本指令集 • 对一条指令的掌握,需要从以下几个方面进行: • 指令的格式 • 指令的功能 • 指令对状态标志位的影响(CF,AF,SF,ZF,PF,OF) • 指令的特殊规定(包括对寻址方式的规定)

  25. 4.4.1 传送类指令1. 通用传送指令 (1)数据传送指令 格式:MOV 目标操作数,源操作数 功能:MOV指令是最基本的通用传送指令,它把一个字节或一个字从源传送到目的。这条指令可实现下述操作: MOV nn,a ;(nn) ←a MOV seg,src ;seg←src MOV dst,seg ;dst←seg MOV r,src ;r←src MOV dst,r ;dst←r

  26. MOV指令可以在寄存器与存储单元之间,寄存器和寄存器之间传送字节或字,也可以将一个立即数送寄存器或存储单元,例如:MOV指令可以在寄存器与存储单元之间,寄存器和寄存器之间传送字节或字,也可以将一个立即数送寄存器或存储单元,例如: MOV AX,TABLE ;变量TABLE的值传送到AX MOV TABLE,DX ;从DX传送到存储地址 MOV ES;[BX],AX ;指定段寄存器到ES,而不用DS MOV DS,AX ;寄存器间16位数传送 MOV DL,AL ;8位寄存器间传送 MOV CL,30 ;常数送寄存器 MOV TABLE,05H ;常数送存储单元

  27. MOV指令的特殊规定: • 源操作数可以是8,16,32位的立即数,段寄存器或者内存操作数。目的操作数是与源操作数等长的寄存器,段寄存器(CS除外)或者内存单元。 • 源、目的操作数不能同时为内存操作数。 • 源、目的操作数的类型必须匹配。如果目的操作数是用间址、基址、变址或者基址加变址的内存单元,而源操作数是单字节或者双字节立即数,则必须用PTR类型说明符说明目的操作数的类型。 • 不能向段寄存器写入立即数, • 不能以CS段寄存器作为目的操作数。

  28. (2)符号扩展传送指令 格式:MOVSX 目标寄存器,源操作数 (3)零扩展传送指令 格式:MOVZX 目标寄存器,源操作数 (4)有效地址传送指令 格式:LEA 目标寄存器,源操作数 (5)指针传送指令 格式:LDS,LES,LFS,LGS,LSS 目标寄存器,源操作数 (6)标志寄存器传送指令 格式:LAHF SAHF (7)交换指令 格式:XCHG 目标操作数,源操作数

  29. (8)字节交换指令 格式:BSWAP 32位寄存器 (9)查表指令 格式:XLAT 表头变量名

  30. 2 堆栈操作指令 目前,微计算机一般都是把内存的一个区域作为堆栈。这个堆栈按照后进先出的原则组织一段内存区域,由堆栈指针指出它在存储器中的位置。8086/8088用段寄存器SS和堆栈指针SP指示堆栈在内存的位置,这个堆栈长度为64KB,因此SP为16位指针的单元。8086/8088规定SP始终指向堆栈的顶部,即始终指向最后压入堆栈的信息所在的单元。8086/8088的堆栈是下推式,即随着压入堆栈的内容的增加,SP的值减小。SP的初值可由MOV SP,im指令来设定。 堆栈操作指令包括入栈指令和出栈指令。

  31. (1)入栈指令 PUSH oprd 入栈指令完成将16位的数据送入堆栈的操作,具体入栈指令如下: PUSH r ; SP←SP-2, (SP) ←r PUSH seg ;SP←SP-2, (SP) ←seg PUSH src ;SP←SP-2, (SP) ←src

  32. (2) 出栈指令 POP oprd 出栈指令完成将16位的数据从堆栈弹出的操作,具体出栈指令如下: POP r ;r←(SP),SP←SP+2 POP seg ;seg←(SP),SP←SP+2 POP dst ;dst←(SP),SP←SP+2

  33. 入栈时,把一个字从上述操作数传送到已由SP指向的堆栈顶部,同时修改SP的值,使SP指向新的栈项单元。入栈时,把一个字从上述操作数传送到已由SP指向的堆栈顶部,同时修改SP的值,使SP指向新的栈项单元。 出栈时,把堆栈顶部的一个字,传送到指定的目标操作数,同时修改SP的值,使SP指向新的栈顶单元。 PUSH和POP指令提供一个先进后出的堆栈结构,它们用SS栈寄存器来指向栈的段地址,用SP堆栈指针来指向栈顶位置,当执行PUSH指令时,SP减2后,将源操作数(一个字)压入栈内,相反POP指令则将当时SP所指定的堆栈中的字取出到目的操作数,然后SP加2。

  34. PUSH和POP指令提供了一种存储的技巧,例如可用于数据交换,将DS的值传给ES,使数据段和附加段指向同一个段地址:PUSH和POP指令提供了一种存储的技巧,例如可用于数据交换,将DS的值传给ES,使数据段和附加段指向同一个段地址: PUSH DS POP ES 又如在程序中要用到某一寄存器,它的值在程序中某一段将被改变,而后面又要用到它,且需要它的原先值,可采用如下方法: PUSH AX ;将AX值存入堆栈 … … ;AX的值被改变的程序段 POP AX ;再取回AX的原先值

  35. (3)PUSHF和POPF指令 PUSHF和POPF是将标志寄存器内容入栈和出栈,这两种指令在调用子程序,保存标志寄存器内容时常用到,即在调用前标志寄存器入栈,返回主程序时,恢复其值。另外,当标志寄存器TF位为1时,8086/8088在每执行一条指令后,便执行一条1型中断指令,即指令执行变成单步方式,这在调试程序时可用到,以便跟踪每条指令执行情况。由于没有任何一条指令能使TF变成1,但这可用下面的方法实现: PUSHF ;标志进栈 POP AX ;标志值送AX OR AX ,0100H ;使TF位置1 PUSH AX ;AX进栈 POPF ;将AX值送到标志寄存器 若要恢复TF=0,则可将OR AX,0100H换成AND AX,0FEFFH来清除TF。

  36. (4)32位标志寄存器进栈/出栈指令 格式: PUSHFD ;标志进栈 POPFD ;将栈顶4个字节送到标志寄存器 (5)16位通用寄存器进栈/出栈指令 格式: PUSHA POPA (6)32位通用寄存器进栈/出栈指令 格式: PUSHAD POPAD

  37. 4.4.2 算术运算指令 1. 基本四则运算 • 1、加减法运算指令 ADD、ADC、SUB、SBB • 2、比较指令CMP • 3、INC、DNC、NEG指令 • 4、交换加法指令 • 5、乘法与除法指令MUL、IMUL、DIV、IDIV • 6、CBW与CWD指令 • 7.十进调整指令

  38. 1、加减法运算指令 ADD、ADC、SUB、SBB • 加法指令 • 带进位加法指令 • 减法指令 • 带借位减法指令

  39. (1)、加法指令 ADD r,src ;r←r+src ADD a,im ;a←a+im ADD dst,im ;dst←dst+im ADD dst,r ;dst←dst+r

  40. (2)带进位加法指令 ADC r,src ; r←r+src+c ADC a,im ;a←a+im+c A D C dst,im ;dst←dst+im+c A D C dst,r ;dst←dst+r+c 其中C为进位标志的现行值。

  41. (3)减法指令 SUB r,src ;r←r-src SUB a,im ;a←a-im SUB dst,im ; dst←dst-im SUB dst,r ; dst←dst-r

  42. (4) 带借位减法指令 SBB r, src ; r r src c SBB a,im ; a a im —c SBB dst,im ; dst dst—im—c SBB dst,r ; dst dst—r—c 其中c为借位标志的现行值

  43. ADD、ADC、SUB、SBB均是作加减运算的指令,其功能是源操作数与目的操作数进行相加或相减,而ADC与ADD的差别是ADC为带进位的加,同样SBB是带借位的减,源操作数可以在寄存器、存储器中或立即数,目的操作数可以在寄存器、存储器中。这些指令运算的结突目的操作数中。上述指令可完成8位(字节)或16位运算超过16位则需多条指令。ADD、ADC、SUB、SBB均是作加减运算的指令,其功能是源操作数与目的操作数进行相加或相减,而ADC与ADD的差别是ADC为带进位的加,同样SBB是带借位的减,源操作数可以在寄存器、存储器中或立即数,目的操作数可以在寄存器、存储器中。这些指令运算的结突目的操作数中。上述指令可完成8位(字节)或16位运算超过16位则需多条指令。 比如操作数长度大于16位的加法,用下面的指令 ADD AX,CX ;低16位相加 ADC BX,DX ;带低16位进位的高位相加 这两条指令将把CX和DX中的32位数加到AX和BX中的32位数中,县后面的一条指令,还将低16位的进位也一起加上,结果在AX和BX中。又比如操作数长度大于16位的减法,可用下面的指令

  44. SUB AX,CX ;低16位相减 SBB BX,DX ;带低16位借位的高位相减 SBB作减法时,不仅BX和DX相减,还要减去上条指令执行相减后的借位,最后的结果低16位将在AX中,高16位将在BX中。 这类指令不能用于存储单元容的加减,也不能用立即数作为目的操作数。它们的运算结果均将影响标志寄存器的CF、OF、PF、SF、ZF和AF。

  45. 2、比较指令CMP 比较指令完成两个操作数加减,使结果反映到标志位上,并不送回相减的差值。指令格式如下: CMP r,src ;r-src CMP a,im ; a-im CMP dst,im ;dst-im CMP dst,r ;dst-r CMP指令是比较指令,用于目的操用数 与源操用数 进行比较,即相减,类似于SUB指令,但不同的是,该指令不保存相减的结果,因而不变操作数 ,它仅影响标志寄存器,表5.3.2示出了比较指令影响标志位的情况。

  46. 一般在使用CMP指令时,后面总是跟着一条条件转移命令,跟据比较结果标志位的情况决定程序的执行方向,由表5.3.2可看出:一般在使用CMP指令时,后面总是跟着一条条件转移命令,跟据比较结果标志位的情况决定程序的执行方向,由表5.3.2可看出: 两位比较要等用零标志位ZF,若ZF=1则表示相等。 不带符号数比较大小时,当借位标志CF=1时,说明源>目的,否则目的>源。 带符号数比较大小时,用符号标志SF与溢出OF半加(异或)来判断,若SF⊕OF=1,则源>目的,否则源<目的。例如: CMP AX,8000H ;AX 与8000H相比较 JL AGAIN ;如AX小于8000H则转AGAIN 当CMP执行后,若SF≠OF时,(即SF⊕CF=1),即源>目的,则转移。

  47. 3、INC、DNC、NEC指令 INC和DEC指令仅有一个操作数,其操作可以是8位或16位的通用寄存器值,也可以是存储单元中的数,INC将执行操作数加1的操作,DEC指令将执行操作数减1的操作,结果仍送回操作的位置中去。这两条指令操作结果均不影响CF标.。 NEC指令为求补指令,它是从零中减去操作数,形成2 的补,操作数仅有一个,可以是寄存器的破除储存单元的数。例如:NEC DATA DATA存储单元内设有数为00000101,则执行该指令后,其内容就变为11111011。

  48. 当从一个立却数中减去寄存器或存储器中的数时,不能用SUB指令,但可以减数变补,然后再和其相加得到减的果,如立即数为100,则可用如下命令:当从一个立却数中减去寄存器或存储器中的数时,不能用SUB指令,但可以减数变补,然后再和其相加得到减的果,如立即数为100,则可用如下命令: NEG AL ADD AL,100 4、交换加法指令 格式:XADD 目标操作数,源操作数

  49. 5、乘法与除法指令MUL、IMUL、DIV、IDIV 8088提供乘法与除法指令,具体指令格式如下: MUL src ; AX←AL*src(无符号数) MUL src ; DX、AX←AX*src(无符号数) IMUL src ; AX←AL*src(符号数) IMUL src ; DX 、AX←AX*src(符号数) DIV src ; AL←AX/src,AH←余数 DIV src ; AX←DX. AX/src, DX←余数 IDIV src ;AL←AX/src, AH←余数(符号数) IDIV src ; AX←DX 、 AX/src,DX←余数(符号数)

More Related