1 / 109

第三章 Intel-8086 的指令系统

第三章 Intel-8086 的指令系统. 3-1 8086 的指令格式. 指令由 操作码 和 操作数 两部分字段组成。 如: MOV AX , 2345H MOV 为操作码; AX 和 2345H 为操作数。 操作码 指示计算机执行何种操作。 操作数 参加操作的数据对象或其所在的地址。. 8086 系列指令包括无操作数指令、单操作数指令和双操作数指令。 如 HLT ;无操作数指令 INC CX ;单操作数指令

Download Presentation

第三章 Intel-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. 第三章 Intel-8086的指令系统 3-1 8086的指令格式 • 指令由操作码和操作数两部分字段组成。 • 如:MOV AX,2345H • MOV为操作码;AX和2345H为操作数。 • 操作码 指示计算机执行何种操作。 • 操作数 参加操作的数据对象或其所在的地址。

  2. 8086系列指令包括无操作数指令、单操作数指令和双操作数指令。 8086系列指令包括无操作数指令、单操作数指令和双操作数指令。 • 如 HLT ;无操作数指令 • INC CX ;单操作数指令 • ADD AX , BX;双操作数指令。第一操作数为目的操作数,第二操作数为源操作数。

  3. 3-2 8086指令的寻址方式 1、指令中数据的存放位置 指令中进行操作的数据存放位置有三种情况: 1)存于指令中(立即数) 数据包含在指令中,即被操作数据直接表示在指令的操作数字段中。 例:MOV AL , 08H 这种操作数称为立即数。 2)存于寄存器中(寄存器操作数) 数据存放在CPU的一个寄存器中。 例:INC CX

  4. 3)存于存储器中(存储器操作数) 数据在内存中或在I/O端口中,存放数据的偏移地址以某种方式表示在指令中。 如: MOV AX,[2500H] MOV AX, [BX] 此例中[2500]、[BX]为存储器操作数。 存储器操作数中操作数字段指示此操作数的偏移地址,而段地址由某个段寄存器提供。此例中默认为数据段DS。

  5. 2、8086指令的寻址方式 • 寻址方式:指令中指明操作数存放位置的表达方式。 • 8086有6种寻址方式 • 1)立即寻址 • 操作数为立即数,直接存放在指令的操作数字段中。 • 只能作为源操作数。

  6. 例:MOV AL, 05H 指令执行后: (AL)=05H 例: MOV AX, 3064H 指令执行后: (AX)=3064H

  7. 2) 寄存器寻址方式 • 操作数在指令所指示的寄存器中。 • 表示格式:直接在指令中写出寄存器名称。 • 如 MOV BX,AX • MOV CL,23H

  8. 3)直接寻址 • 操作数存放在内存中,操作数的偏移地址直接表示在指令中。 • 表示格式:[偏移地址] • 如 MOV AX,[3100H] • 默认操作数存放在内存的数据段中。

  9. ... 操作码 代 6 0 0 0 0 码 00 + 段 3 1 0 0 31 6 3 1 0 0 ... 63100H 50H 数 AH AL 据 30H 段 30H 50H ... 例:MOV AX,[3100H] 若 (DS)=6000H (63100H)=3050H 则 (AX)=3050H

  10. 操作数也允许存放在其它段中(SS,ES),此时应在指令中指明段超越。操作数也允许存放在其它段中(SS,ES),此时应在指令中指明段超越。 • 段超越 • 若操作数不在指令默认的段中,而是在其它某个段中,则需要在指令中加以表示,这种情况称为段超越。 • 表示 • 如直接寻址方式中操作数在附加段中,则应表示为 MOV AX,ES:[3100H]

  11. 4) 寄存器间接寻址方式 • 操作数在存储器中, 操作数偏移地址在BX、SI、DI或BP的某个寄存器中。 • 若以SI、DI、BX作为间接寻址寄存器 • 则默认操作数存放在数据段中,用DS寄存器的内容作为段地址。 • 若以BP寄存器作为间接寻址寄存器 • 则默认操作数存放在堆栈段中,用SS寄存器的内容作为段地址。

  12. 表示格式:[寻址寄存器] 如 MOV BX,[DI] 若 (DS)=6000H (DI)=2000H(62000H)=50A0H 则执行指令后 (BX)=50A0H

  13. 寄存器间接寻址方式也允许段超越。 • 如 • MOV AX, DS:[BP] • MOV CH, SS:[SI] • MOV ES:[BX], AL • 设(AL)=B2H,(BX)=1234H • (ES)=1400H,则执行指令后:

  14. 变址寻址方式 • 操作数的偏移地址是以寄存器SI、DI、BX、BP的内容与指令中给定的8位或16位偏移量之和。 • 如 MOV AH,1000H[BX] • 或写成MOV AH,[BX+1000H] • 又如 MOV 25H[BP] ,BX • 表示格式:位移量[寄存器]或 [寄存器+位移量] • 若以SI、DI、BX寻址,则默认在数据段中;若以BP寻址,则默认在堆栈段中。

  15. 6)基址加变址寻址方式 • 操作数的偏移地址是一个基址寄存器BX或BP和一个变址寄存器SI或DI的内容之和加上给定的8位或16位偏移量。 • 表示格式: 位移量[基址][变址] • 或 [位移量+基址+变址] • 如 MOV 10H[BX][SI],CX • 或写为 MOV [10H+BX+SI],CX • BX寻址默认为数据段;BP寻址默认为堆栈段。

  16. 3-3 8086指令系统 • 可以分为以下六类: 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 控制转移指令 处理器控制指令

  17. 3.3.1 数据传送类指令 • 包括: 通用传送指令;累加器专用传送指令; 地址传送指令;标志传送指令; 1、通用传送指令 1)基本传送指令(MOV) • 指令格式:MOV DST,SRC; • 源操作数和目的操作数可用上述6种寻址方式的任何一种。 • 操作:将SRC内容赋给DST。 • 所有通用传送指令都不影响标志位。

  18. 注意:不能用MOV指令实现以下传送 • 存储器操作数之间不能直接传送 MOV [1000H] , [DI] 错 应改为 MOV AX , [DI] MOV [1000H], AX • 立即数不能直接传送段寄存器 MOV DS,2000H 错 应改为 MOV AX, 2000H MOV DS , AX

  19. 段寄存器之间不能直接传送 MOV ES , DS ; 错 应改为 MOV BX , DS MOV ES , BX • CS只可以作为源操作数 • 例:MOV CS,AX ;错 MOV AX,CS ;对 • 源操作数和目的操作数的宽度必须相同

  20. 存储器 (各种寻址) 立即数 通 用 寄存器 段寄存器

  21. 2)堆栈指令(PUSH 、POP) • 堆栈(STACK)的概念 • 数据的存储按后进先出(Last In First Out——LIFO)原则组织的一段内存区域。

  22. 入栈指令(PUSH): • 格式:PUSH src • 操作过程分两步完成: • (SP)  (SP) - 2 • ((SP)+1,(SP))  (src) • 功能:把一个字压入由SP指向的堆栈区。 • 如:PUSH AX

  23. SS SP 6000H 2000H 6 0 0 0 0 ... + 2 0 0 0 CDH 6 2 0 0 0 ABH AX AOH 堆 62000H 栈 50H A0H 50H 段 ... 若(AX)=50A0H SP=2002H SS=6000H 则执行 PUSH AX的结果如右图。 若再执行 PUSH BX 设(BX)=0ABCDH,结果如右图。

  24. 出栈指令(POP) • 格式:POP dst ; • 操作: • (dst)  ((SP)+1,(SP)) • (SP)  (SP)+2 • 功能:把SP所指向的堆栈顶部的一个字 送入目的地址,同时进行修改堆栈指针。 • 如: POP BX • POP AX

  25. PUSH [2300H] • PUSH CS • 但 POP CS 错

  26. 堆栈用途如下图

  27. 断点信息:程序断点地址、标志寄存器及其它能被子程序使用和改变的寄存器。断点信息:程序断点地址、标志寄存器及其它能被子程序使用和改变的寄存器。

  28. 堆栈用途 • 存放寄存器或存储器中暂时不使用的数据,在使用这些数据时可方便地将其弹出; • 调用子程序或发生中断时要保护断点信息(入栈),子程序或中断返回时恢复断点信息(出栈)。

  29. 应注意的问题 • 堆栈操作都按字操作; • PUSH , POP 指令的操作数可以是CPU内部寄存器或存储单元; • PUSH CS 合法,POP CS 非法; • 执行PUSH 指令, (SP)-2  (SP),低字节放在低地址,高字节放在高地址; • SP总是指向栈顶; • 堆栈最大容量即为SP的初值。

  30. 3)交换指令(XCHG) • 格式:XCHG dst , src ;(dst) (src) • 可以实现:寄存器之间 • 寄存器和存储器之间 • 注意: • 存储器之间不能直接交换; • 段寄存器不能作为操作数; • 允许字或字节操作。

  31. 2、累加器专用传送指令 • 1)输入指令(IN) • 功能:用于CPU从外设端口接收数据。 • 具体形式有四种: • IN AL, data8;从8位端口地址输入一个字节 • IN AX, data8;从8位端口地址输入一个字 • IN AL, DX;从16位端口地址输入一个字节 • IN AX, DX ; 从16位端口地址输入一个字

  32. 例1: IN AL, 80H; 从地址为80H的端口读入一个字节; 例2: MOV DX, 1020H; 将16位端口地址赋给DX IN AX, DX; 从(DX)为地址的端口读入16位数据。

  33. 8位或16位 20位 地址总线 AB CPU I/O 接 口 输 出 设 备 I/O 接 口 存 储 器 输 入 设 备 数据总线 DB 控制总线 CB • 解释: 1)CPU对各个外部设备接口也采用地址编码。 8086CPU连接外部设备的地址可以是8位或16位。

  34. 解释: 2)8086CPU访问存储器和访问外部设备采用不同的指令形式,外设地址与存储器地址可以重叠。 • 通过CPU的IO/M引脚控制存储器或外设被选通;当访问存储器时IO/M引脚输出低电平,当访问外设时该引脚输出高电平。

  35. 地址总线 AB CPU I/O 接 口 输 出 设 备 I/O 接 口 存 储 器 输 入 设 备 数据总线 DB 控制总线 CB IO/M MOV BX,[1234H];从存储器的[1234H]单元读数据,放入BX。CPU执行该指令使IO/M=0 MOV DX,1234H;立即数赋给DX IN AX,DX;从地址为[1234H] 的外设读数据, CPU执行该指令使IO/M=1

  36. 2)输出指令(OUT) 功能:用于CPU向外设端口发送数据 四种形式: OUT data8 , AL;向8位地址端口输出一个字节 OUT data8, AX ;向8位地址端口输出一个字 OUT DX , AL;向16位地址端口输出一个字节 OUT DX , AX ;向16位地址端口输出一个字

  37. 3、目的地址传送指令 • 8086 提供三条: • LEA • LDS • LES

  38. 1)LEA (Load Effective Address) 格式: LEA reg16 , mem Reg16 — 16位通用寄存器; mem — 存储单元; 功能:将源操作数的偏移地址传送到目的操作数; 注意:源操作数必须以寄存器间接寻址、变址寻址、基址加变址寻址等方式表示的存储器操作数;目的操作数为一个16位的通用寄存器。

  39. 例: LEA AX,[DI] 设(DI)=1005H 执行 LEA AX,[DI],有(AX)=1005H 例: LEA BX,[BX+SI+0F62H] 设(BX)=0400H,(SI)=003CH 执行指令后: 源操作数地址为:(BX)+(SI)+ 0F62H =0400H+003CH+0F62H=139EH 则(BX)=139EH

  40. 2)LDS (Load pointer using DS)(略) 格式:LDS reg16 , mem ; 功能:把源操作数指定的4个相继字节的数据分别送指令指定的寄存器及DS寄存器中。 (reg16)←(mem) (DS)←((mem)+2)

  41. 3)LES (Load pointer using ES )(略) 格式:LES reg16 ,mem ; 功能:把源操作数指定的4个相继字节的数据分别送指令指定的寄存器及ES寄存器中。 (reg16)←(mem) (ES)←((mem)+2)

  42. 存储器 (DS) ... C000H:0010H 80H C0010H C0011H 01H C0012H 00H C0013H 20H ... 例: 设 (DS)=0C 000H 指令 LDS SI, [0010H] 执行指令后: (SI)=0180H (DS)=2000H

  43. (BX) (DS) 存储器 ... B000H:080AH A2H B080AH 05H B080BH B080CH 00H B080DH 40H ... 例: 设 (DS)=B 000H (BX)=080AH 指令 LES DI, [BX] 执行指令后: (DI)=05A2H (ES)=4000H

  44. 4、标志传送指令 8086有四条标志传送操作指令: 1)LAHF(Load AH into flags) 格式:LAHF ; 功能:标志寄存器低八位传送给AH (AH)←(PSW的低字节)

  45. 2)SAHF(Store AH into Flags) 格式:SAHF 功能:AH内容传送给标志寄存器低八位。 (PSW的低字节)←(AH)

  46. 3)PUSHF(Push Flags ) 格式:PUSHF ; 功能 : 标志进栈。 (SP)←(SP)-2 ((SP)+1,(SP))←(PSW) 4)POPF(Pop Flags ) 格式:POPF; 功能:标志出栈。 (PSW)←((SP)+1,(SP)) (SP)←(SP)+2

  47. 3.3.2 算术运算类指令 • 包括: 加法指令、减法指令、乘法指令、除法指令 1、加法指令 • 8086具有5条加法指令: • ADD(Addition) 加法指令 • ADC(Add with Carry)带进位加法指令 • INC(Increment)加 1指令 • AAA(ASCII adjust for addition)加法ASCII调整指令(略) • DAA(Decimal adjust for addition)加法十进制调整指令(略)

  48. 1)不含进位的加法指令ADD 指令格式:ADD dest , src ; 功 能 :(dest) (dest)+(src) Src:立即数,通用寄存器,存储器 dest:通用寄存器,存储器 例: ADD CL,10 ADD DX,SI ADD AX, [2F00H] ADD 100H[BX], AL ADD [DI], 30H

  49. 特点: • 可进行8位或16位的无符号数或有符号数加法运算; • 源操作数和目标操作数不能同时为存储器, 不能为段寄存器; • 指令影响标志位 • 8位(有符号)数相加,和超出范围(-128~+127),或16位(有符号)数相加,和超出范围(-32768 ~ +32767),则 O=1 • 8位(无符号)数相加,和超过255,或16位(无符号)数相加,和超过65535,则 C=1, • 其他标志(S,A,P,Z)由运算结果按定义确定。

  50. 2)含进位加法指令ADC(Add with carry) 格式: ADC dest,src ; 功能:(dest)←(dest)+(src)+C C: 进位标志C的当前值 特点: 与ADD同。 类型举例: ADC CX, 300 ADC AL, BL ADC DX, [SI]

More Related