1 / 101

第三章 8086 指令系统

第三章 8086 指令系统. 指令系统是微处理器( CPU )所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解 INTEL 公司生产的 8086/8088CPU 的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。 通过本章的学习,读者应该掌握以下内容: • 4 种操作数的寻址方式 • 常用指令的格式、功能、以及对标志位的影响. §3.1 8086 的寻址方式. 汇编指令的格式如下 :. 操作码 操作数. 操作码: 指令操作类型;(必须有)

Download Presentation

第三章 8086 指令系统

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. 第三章 8086指令系统 指令系统是微处理器(CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解INTEL公司生产的8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。 通过本章的学习,读者应该掌握以下内容: •4种操作数的寻址方式 •常用指令的格式、功能、以及对标志位的影响

  2. §3.18086的寻址方式 汇编指令的格式如下: 操作码 操作数 操作码:指令操作类型;(必须有) 操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个(一个源操作数,一个目的操作数),也可以没有。 例: MOV AX,CX ;将CX的内容送入AX中。 INC AX STI

  3. 一、 立即寻址方式 指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。 例 :MOV AL,5 ;源操作数为立即寻址 指令执行后,AL=05H,8位数据05H存入AL寄存器。 例 :MOV AX,3064H ;源操作数为立即寻址 指令执行后,AX=3064H,16位数据3064H存入AX寄存器。

  4. 注意:①立即数只能作源操作数,不能作目的操作数。注意:①立即数只能作源操作数,不能作目的操作数。 ②以A、B、C、D、E、F开头的数字出现在指令中时,必须在前面加一个数字0。 ③立即数可以送到寄存器、存储器中。 例:下列指令是错误的。 MOV 2000H,AX MOV AL,B5H 而指令MOV [2000H],1234H是对的。

  5. 二、 寄存器寻址方式 寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES、SS;其中AX、BX、CX、DX可分成两个8位寄存器别使用。 例: MOV AX,CX ;(AX) (CX) MOV AL,1 ;(AL) 1 注意:①CS不能作为目的操作数,如MOV CS,AX是错误的指令。 ②源操作数必须与目的操作数相匹配。如 MOV AL,BX是错误的

  6. 三、 存储器寻址方式 在存储器寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA(即偏移地址),段地址通常在隐含的某个段寄存器中。由于内存单元的地址的给出方式不同,存储器寻址又可分为以下几种寻址方式:直接寻址、寄存器间址、寄存器相对寻址、基址变址寻址、基址变址相对寻址。

  7. 1、直接寻址方式 形式:MOV AX,[nn] MOV AX,X 在直接寻址方式中,操作数的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和标号两种形式),它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由DS 指定,也可以ES指定,但需在指令中指明。最后存储器地址为:DS:偏移地址 或 ES:偏移地址。

  8. 例: MOV AX,[2000H] 将DS:2000H单元内容送入AX MOV AL,[2000H] 将DS:2000H单元的内容取一个字节送AL 例: MOV AX,ES:[2000H] 将ES:2000H单元中的内容送入AX MOV AL,X X必须是数据段中用DB定义的变量 传送原则:低地址的内容(字节)送寄存器的低位,高地址的内容送寄存器的高位。

  9. 2、寄存器间接寻址 寄存器间接寻址方式的操作数形式为:[reg] 操作数的有效地址包含在基址寄存器BX,基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。 例: MOV AX,[BX];将由BX决定的存储单元的内容送到AX寄存器。 数据段 0000 0001 BB TAB: 0002 AA 0003 AX AA BB BX 0001 AH AL 间接寻址

  10. 操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。 (BX) (SI) (DI) (BP) 段寄存器为DS 有效地址 = 段寄存器为SS 物理地址计算方法: 物理地址 = (DS)* 16 + (BX)或(SI)或(DI) 物理地址 = (SS)* 16 + (BP)

  11. 例:已知:(DS)=2100H,(DI)=2000H 指令: MOV AX,[DI] ;(AX) ((DI)) 物理地址=(DS) * 16 + (DI) =2100H * 16 + 2000H =21000H + 2000H =23000H 指令结果:将23000H单元内容送AL中, 将23001H单元内容送AH中。 例: MOV AX,DS:[BP] MOV BX,ES:[SI]

  12. 3、寄存器相对寻址方式 操作数在存储器内,指令中寄存器内容与指令指定的位移量(DISP)之和作为操作数所在单元的有效地址。 (BX)DISP8 (SI) (DI) (BP) DISP16 段寄存器为DS 有效地址 = + 段寄存器为SS 物理地址 = (DS)* 16 +(BX)+DISP8 (SI)、(DI)、DISP16类同。 物理地址= (SS) *16 + (BP)+DISP16

  13. 例:如果 (DS)=3000H, (SI)= 2000H, COUNT=3000H, 则执行指令 MOV AX,CONUT[SI],求出此种寻址方式对应的有效地址和物理地址。 有效地址= 2000H + 3000H = 5000H 物理地址=(DS)*16 + 5000H =30000H + 5000H =35000H 4、基址变址寻址方式: 操作数在存储器中,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址。

  14. (BX) (SI) (BP) (DI) + 有效地址 = 物理地址 = (DS) * 16 + (BX)+ (SI)或(DI) 物理地址 = (SS) * 16 + (BP) + (SI)或(DI) 例: MOV AX,[BX+DI] 或 MOV AX,[BX][DI] DS:(BX)+(DI) 字存储单元内容送AX。 例: MOV AX,[BP+SI] 或 MOV AX,[BP][SI] SS:(BP)+(SI) 字存储单元内容送AX。

  15. 例:如果 (DS)=2100H, (BX)= 0158H, (DI)=10A5H, EA=11FDH, 则执行指令 MOV AL,[BX][DI] 有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH 物理地址:(DS) * 16 + 有效地址=21000H+11FDH=221FDH 执行结果:将221FDH单元内容送入寄存器AL中。 5、基址变址相对寻址方式 操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。 (BX) (SI) DISP8 (BP) (DI) DISP16 有效地址= + +

  16. 物理地址 = (DS)* 16 +(BX)产生的有效地址 物理地址 = (SS)* 16 +(BP)产生的有效地址 例:已知:(DS)=3000H,(BX)=2000H,(SI)=1000H,MK=0250H 指令: MOV AX,MK[BX][SI] 或 MOV AX,MK[BX+SI] 或 MOV AX,[MK+BX+SI] 有效地址:MK+(BX)+(SI)=0250H+2000H+0100H =3250H 物理地址:(DS)*16 +有效地址=30000H+3250H=33250H 执行结果:将33250H单元内容送AL,33251H内容送AH。

  17. 6、 段超越 当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。 段超越前缀形式为: 段寄存器名:MEM 例如: MOV AX,ES:[BP] ;段地址在ES MOV AX,CS:[BX] [SI] ;段地址在CS 段地址的基本约定和允许超越的情况如表所示:

  18. 7、 对内存寻址方式的注解 (1)在汇编后,指令中的变量名有具体的偏移地址所取代。 (2)在寄存器相对寻址与相对基址变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。 (3)在Microsoft宏汇编MASM(Microsoft Macro Assembler)中,内存操作数可以采用多种书写形式: 6[BX][SI]、[BX+6][SI]、[BX+SI+6]

  19. (4)在[ ]中只能出现立即数和BX、BP、SI、DI,且BX和BP、SI和DI不能成对出现在[ ]中。 如:[BX+BP]、[SI+DI]是非法的指令形式 (5)计算出的有效地址以16位表示,若超过0FFFFH,CPU将忽略所有溢出。 (6)记忆8086内存操作数形式的简易方法如下: [BX] [SI] disp [BP] [DI] 每列选择一项、二项或三项,即可得到有效的内存操作数形式。

  20. 四、端口寻址方式 操作数在端口寄存器中,指令中给出了端口的地址。根据端口地址的不同,有两种寻址方式: 1、端口直接寻址 端口为8位地址00H——FFH 如:IN AL,80H;8位数据 IN AX,80H;16位数据 OUT 81H,AL 2、端口间接寻址 端口为16位地址0000H——FFFFH 如:MOV DX,218H IN AL,DX

  21. 操作数的寻址方式

  22. §3.2 指令的机器码表示方法(略)

  23. §3.3 8080指令系统 8086/8088的指令系统可以分为6组: (1)数据传送指令 (2)算术运算指令 (3)逻辑指令与移位指令 (4)串操作指令 (5)控制转移指令 (6)处理机控制指令

  24. 一、 数据传送指令 数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中。这类指令又可分为以下几种情况: 通用传送指令:MOV、PUSH/POP、XCHG、XLAT 输入输出指令:IN、OUT 地址目标传送指令:LEA、LDS、LES 标志传送指令:LAHF、SAHF、PUSHF、POPF

  25. 1、通用传送指令 (1)MOV(Move):传送指令 MOV指令的格式为: MOV dest,src ;dest←src 功能:将源操作数src复制到目的操作数dest中,源操作数src的内容不变。 对标志位的影响:无 语法格式: MOV reg/mem/seg ,reg/mem/seg/imm MOV指令的操作数及传送方向见下页

  26. 立即数IMM 通用寄存器 REG 存储器 MEM DS、ES、SS CS(SEG)

  27. 说明: ①双操作数指令不允许两个操作数同时为段寄存器或存储器操作数 MOV seg , seg ;错误 MOV mem ,mem ;错误 ②立即数不能传送到段寄存器中 MOV seg ,imm ; 错误 ③立即数不能作为目的操作数 MOV imm ,reg ; 错误 ④目的操作数不允许使用CS、IP寄存器 MOV CS,AX ; 错误

  28. ⑤dest与src必须类型匹配,即同时是字节或字类型。⑤dest与src必须类型匹配,即同时是字节或字类型。 • MOV AX,BX • 注意: • 寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。 • 立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。 • MOV AL,34H • MOV BX,56H • 有时MASM不能确定内存操作数的类型,需要用byte ptr和word ptr明确指出是字节或字类型。只要其中一个操作数的类型确定即可。 • MOV [2000H],AL • MOV [2000H],BYTE PTR 34H

  29. 例:错误的MOV 指令如下所示: MOV AX,BL ;类型不匹配 MOV DS,1000H ;不允许立即数送段寄存器 MOV [BX] ,[SI] ;不允许内存操作数之间传送 MOV ES,CS ;不允许段寄存器之间传送 MOV CS,AX ;CS不能作为目的操作数 例:设B是已定义的字节变量,以下是一些错误和正确的指令。 MOV AX,B ;错误,类型不匹配 MOV B,0 ;正确,MASM可以判断出要 送字节0到单元B中 MOV [BX],1 :错误,不能确定数据类型 MOV BYTE PTR [BX],1;正确

  30. (2)XCHG(Exchange):交换指令 XCHG指令的格式为: XCHG oprd1 , oprd2;交换oprd1与oprd2的内容 语法格式为: XCHG reg/mem,reg/mem 例:设数据段中有两个字变量W1和W2,将这两个数据互换的程序段如下: MOV AX,W1 XCHG AX,W2 MOV W1,AX

  31. 不用数据交换指令,仅用MOV 指令的程序段如下: MOV AX,W1 MOV BX,W2 MOV W1,BX MOV W2,AX 还可以用堆栈操作指令来实现,程序段如下: PUSH W1 PUSH W2 POP W1 POP W2 若W1、W2为字节操作数,则前两种方式均可行(用8位寄存器),但不能用堆栈操作指令实现,因为堆栈操作只能是字操作。

  32. (3)PUSH:入堆操作 PUSH REG/MEM/SEG 操作:(SP) (SP)-2, ((SP)+1,(SP)) (SRC) 即先移后入。 (4)POP:出栈 操作 POP REG/MEM/SEG 操作:(DST) ((SP)+1,(SP)) (SP) (SP)+2 先出后移。但CS不能作为目的操作数。

  33. 堆栈 堆栈 1 2 SS:01F8 SS:01F8 SS:01FA SS:01FA SS:01FC SP AX SS:01FC 1101H SS:01FE 1101H SS:01FE SP AA BB AA BB (执行PUSH AX之前) (执行PUSH AX之后) 堆栈 3 SS:01F8 SS:01FA AX SS:01FC 1101H SS:01FE SP AA BB (执行POP AX之后)

  34. (5)XLAT 查表指令 格式:XLAT ; [BX+AL] AL 功能:将表首地址为BX,偏移地址为AL的单元的内容送到AL中。该指令通常用来实现一种代码向另一种代码的转换。

  35. 例:若十进制数字0-9的LED七段代码对照表如前所示,试用求数字5的七段代码。例:若十进制数字0-9的LED七段代码对照表如前所示,试用求数字5的七段代码。 TABLE DB 40H,79H,24H,30H,19H DB 12H,02H,78H,00H,18H 方法1: MOV AL,5 MOV BX,OFFSET TABLE XLAT 方法2: MOV SI,5 MOV BX,OFFSET TABLE MOV AL,[BX+SI]

  36. 2、输入输出指令 输入输出指令是用来实现I/O端口与AX之间的数据传送。根据端口地址的不同,又分为端口直接寻址和端口间接寻址两种。 (1)IN(INPUT) 格式:IN AL,(PORT);8位地址、8位数据 IN AX,(PORT);8位地址、16位数据 或:IN AL,DX ;16位地址、8位数据 IN AX,DX ;16位地址、16位数据 (2)OUT(OUTPUT) 格式:OUT DX,AL ;其余类同。

  37. 3、地址目标传送指令 (1)LEA:取有效地址 格式:LEA REG,MEM 功能:取源操作数地址的偏移量,并把它传送到止的操作数所在的单元。 要求:源操作数必须是一个存储器操作数,目标操作数必须是一个除段寄存器以外的16位寄存器,通常是间址寄存器SI等。

  38. LEA 指令与MOV 指令的区别: LEA SI,BUFF指令是将标号BUFF的偏移地址送入寄存器中; MOV SI,BUFF指令是将标号BUFF所指存储单元的内容送入SI。 段起始地址 0 1 LEA SI,BUFF; 执行后:(SI)=0002H MOV SI,BUFF; 执行后:(SI)=0048H BUFF = 2 48 3 00 4 FE 5 FF

  39. (2)LDS:传送有效地址及数据段首址指令 格式:LDS reg16 ,mem32; 功能:将源操作数指定的存储单元中取4个字节,前两个字节送入指定寄存器,后两个字节送DS寄存器。 (3)LES:传送有效地址及附加数据段指令 格式:LES reg16 ,mem32; 功能:将源操作数指定的存储单元中取4个字节,前两个字节送入指定寄存器,后两个字节送ES寄存器。

  40. 说明:指令中源操作数必须是存储单元,从该单元开始的连续4个字节单元中,存放着一个变量的地址指针。说明:指令中源操作数必须是存储单元,从该单元开始的连续4个字节单元中,存放着一个变量的地址指针。 例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H LDS SI,[2480] DS:2480H 57H DS:2481H 13H DS:2482H 68H 13 57 SI DS:2483H 24H 24 68 DS

  41. LDS指令例 • DS = 6000H • DI = 1234H • AX = 2233H ┇ 1200H 34H 数据段 1 12H 00H DS DI 60H 60 00 12 34 ┇ 数据段2 33H 61234H 22H ┇

  42. 4. 标志传送(位操作)指令 LAHF SAHF PUSHF POPF 隐含操作数AH 隐含操作数FLAGS

  43. LAHF,SAHF (1)LAHF ;将FLAGS的低8位装入AH (2)SAHF ;执行与LAHF相反的操作 D7 D0 AH …. D15 D0 FLAGS AF PF SF ZF CF

  44. 例:标志寄存器传送。 执行前:(FLAGS)=0485H,(AX)=0FFFFH 执行指令LAHF后, (FLAGS)=? (3)PUSHF 功能:将标志寄存器的内容进栈,同时修改SP。 (4)POPF 功能:把当前SP所指的字送到标志寄存器PSW,并修改SP的值。

  45. 标志传送指令说明: • LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。 • PUSHF/POPF指令是标志寄存器PSW与堆栈间进行的字型数据传送。 • 指令SAHF/POPF将影响标志位。所有的数据传送类指令仅此两条指令影响标志位。

  46. 二、 算术运算指令 运算的数据类型:有符号二进制数、无符号二进制数、无符号压缩BCD码、无符号非压缩BCD码。 除CBW、CWD外,所有指令均影响标志位。 指令类型: 加法:ADD、ADC、INC 减法:SUB、SBB、DEC、NEG、CMP 乘法:MUL、IMUL 除法:DIV、IDIV 符号扩展:CBW、CWD 十进制调整:DAA、DAS、AAA、AAS、AAM、AAD

  47. 1、加法指令 指令格式: 加法 ADD DST,SRC;(DST) (SRC)+(DST) 带进位加法 ADC DST,SRC; (DST) (SRC)+(DST)+CF 加 1 INC DST ;(DST) (DST)+1 说明:①这在三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。 ②SRC可为IMM、MEM、REG,而DST只能为REG、MEM类型。 ③加法指令也有数据传送的功能,所以前面数据传送指令的限制同样有效。如不能同时为存储器操作数

  48. 例:将3个32位无符号数12345678H,8765ABCDH和2468FEDCH相加,其和(仍为32无符号位数)送DX和AX的程序段如下:例:将3个32位无符号数12345678H,8765ABCDH和2468FEDCH相加,其和(仍为32无符号位数)送DX和AX的程序段如下: MOV DX,1234H MOV AX,5678H ADD AX,0ABCDH ADC DX,8765H ADD AX,0FEDCH ADC DX,2468H 注意:字母开头的十六进制数,要在其前面加一数字0

  49. ④对INC 指令,DST既是源操作数,又是目的操作数,因此DST只能是REG或MEM,为MEM操作数时,必须指明数据类型,否则出错。 如:INC [SI] ;错误 应为:INC WORD PTR [SI] ;字内容加1 INC BYTE PTR [SI] ;字节内容加1

More Related