1.09k likes | 1.28k Views
第三章 Intel-8086 的指令系统. 3-1 8086 的指令格式. 指令由 操作码 和 操作数 两部分字段组成。 如: MOV AX , 2345H MOV 为操作码; AX 和 2345H 为操作数。 操作码 指示计算机执行何种操作。 操作数 参加操作的数据对象或其所在的地址。. 8086 系列指令包括无操作数指令、单操作数指令和双操作数指令。 如 HLT ;无操作数指令 INC CX ;单操作数指令
E N D
第三章 Intel-8086的指令系统 3-1 8086的指令格式 • 指令由操作码和操作数两部分字段组成。 • 如:MOV AX,2345H • MOV为操作码;AX和2345H为操作数。 • 操作码 指示计算机执行何种操作。 • 操作数 参加操作的数据对象或其所在的地址。
8086系列指令包括无操作数指令、单操作数指令和双操作数指令。 8086系列指令包括无操作数指令、单操作数指令和双操作数指令。 • 如 HLT ;无操作数指令 • INC CX ;单操作数指令 • ADD AX , BX;双操作数指令。第一操作数为目的操作数,第二操作数为源操作数。
3-2 8086指令的寻址方式 1、指令中数据的存放位置 指令中进行操作的数据存放位置有三种情况: 1)存于指令中(立即数) 数据包含在指令中,即被操作数据直接表示在指令的操作数字段中。 例:MOV AL , 08H 这种操作数称为立即数。 2)存于寄存器中(寄存器操作数) 数据存放在CPU的一个寄存器中。 例:INC CX
3)存于存储器中(存储器操作数) 数据在内存中或在I/O端口中,存放数据的偏移地址以某种方式表示在指令中。 如: MOV AX,[2500H] MOV AX, [BX] 此例中[2500]、[BX]为存储器操作数。 存储器操作数中操作数字段指示此操作数的偏移地址,而段地址由某个段寄存器提供。此例中默认为数据段DS。
2、8086指令的寻址方式 • 寻址方式:指令中指明操作数存放位置的表达方式。 • 8086有6种寻址方式 • 1)立即寻址 • 操作数为立即数,直接存放在指令的操作数字段中。 • 只能作为源操作数。
例:MOV AL, 05H 指令执行后: (AL)=05H 例: MOV AX, 3064H 指令执行后: (AX)=3064H
2) 寄存器寻址方式 • 操作数在指令所指示的寄存器中。 • 表示格式:直接在指令中写出寄存器名称。 • 如 MOV BX,AX • MOV CL,23H
3)直接寻址 • 操作数存放在内存中,操作数的偏移地址直接表示在指令中。 • 表示格式:[偏移地址] • 如 MOV AX,[3100H] • 默认操作数存放在内存的数据段中。
... 操作码 代 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
操作数也允许存放在其它段中(SS,ES),此时应在指令中指明段超越。操作数也允许存放在其它段中(SS,ES),此时应在指令中指明段超越。 • 段超越 • 若操作数不在指令默认的段中,而是在其它某个段中,则需要在指令中加以表示,这种情况称为段超越。 • 表示 • 如直接寻址方式中操作数在附加段中,则应表示为 MOV AX,ES:[3100H]
4) 寄存器间接寻址方式 • 操作数在存储器中, 操作数偏移地址在BX、SI、DI或BP的某个寄存器中。 • 若以SI、DI、BX作为间接寻址寄存器 • 则默认操作数存放在数据段中,用DS寄存器的内容作为段地址。 • 若以BP寄存器作为间接寻址寄存器 • 则默认操作数存放在堆栈段中,用SS寄存器的内容作为段地址。
表示格式:[寻址寄存器] 如 MOV BX,[DI] 若 (DS)=6000H (DI)=2000H(62000H)=50A0H 则执行指令后 (BX)=50A0H
寄存器间接寻址方式也允许段超越。 • 如 • MOV AX, DS:[BP] • MOV CH, SS:[SI] • MOV ES:[BX], AL • 设(AL)=B2H,(BX)=1234H • (ES)=1400H,则执行指令后:
变址寻址方式 • 操作数的偏移地址是以寄存器SI、DI、BX、BP的内容与指令中给定的8位或16位偏移量之和。 • 如 MOV AH,1000H[BX] • 或写成MOV AH,[BX+1000H] • 又如 MOV 25H[BP] ,BX • 表示格式:位移量[寄存器]或 [寄存器+位移量] • 若以SI、DI、BX寻址,则默认在数据段中;若以BP寻址,则默认在堆栈段中。
6)基址加变址寻址方式 • 操作数的偏移地址是一个基址寄存器BX或BP和一个变址寄存器SI或DI的内容之和加上给定的8位或16位偏移量。 • 表示格式: 位移量[基址][变址] • 或 [位移量+基址+变址] • 如 MOV 10H[BX][SI],CX • 或写为 MOV [10H+BX+SI],CX • BX寻址默认为数据段;BP寻址默认为堆栈段。
3-3 8086指令系统 • 可以分为以下六类: 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 控制转移指令 处理器控制指令
3.3.1 数据传送类指令 • 包括: 通用传送指令;累加器专用传送指令; 地址传送指令;标志传送指令; 1、通用传送指令 1)基本传送指令(MOV) • 指令格式:MOV DST,SRC; • 源操作数和目的操作数可用上述6种寻址方式的任何一种。 • 操作:将SRC内容赋给DST。 • 所有通用传送指令都不影响标志位。
注意:不能用MOV指令实现以下传送 • 存储器操作数之间不能直接传送 MOV [1000H] , [DI] 错 应改为 MOV AX , [DI] MOV [1000H], AX • 立即数不能直接传送段寄存器 MOV DS,2000H 错 应改为 MOV AX, 2000H MOV DS , AX
段寄存器之间不能直接传送 MOV ES , DS ; 错 应改为 MOV BX , DS MOV ES , BX • CS只可以作为源操作数 • 例:MOV CS,AX ;错 MOV AX,CS ;对 • 源操作数和目的操作数的宽度必须相同
存储器 (各种寻址) 立即数 通 用 寄存器 段寄存器
2)堆栈指令(PUSH 、POP) • 堆栈(STACK)的概念 • 数据的存储按后进先出(Last In First Out——LIFO)原则组织的一段内存区域。
入栈指令(PUSH): • 格式:PUSH src • 操作过程分两步完成: • (SP) (SP) - 2 • ((SP)+1,(SP)) (src) • 功能:把一个字压入由SP指向的堆栈区。 • 如:PUSH AX
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,结果如右图。
出栈指令(POP) • 格式:POP dst ; • 操作: • (dst) ((SP)+1,(SP)) • (SP) (SP)+2 • 功能:把SP所指向的堆栈顶部的一个字 送入目的地址,同时进行修改堆栈指针。 • 如: POP BX • POP AX
PUSH [2300H] • PUSH CS • 但 POP CS 错
断点信息:程序断点地址、标志寄存器及其它能被子程序使用和改变的寄存器。断点信息:程序断点地址、标志寄存器及其它能被子程序使用和改变的寄存器。
堆栈用途 • 存放寄存器或存储器中暂时不使用的数据,在使用这些数据时可方便地将其弹出; • 调用子程序或发生中断时要保护断点信息(入栈),子程序或中断返回时恢复断点信息(出栈)。
应注意的问题 • 堆栈操作都按字操作; • PUSH , POP 指令的操作数可以是CPU内部寄存器或存储单元; • PUSH CS 合法,POP CS 非法; • 执行PUSH 指令, (SP)-2 (SP),低字节放在低地址,高字节放在高地址; • SP总是指向栈顶; • 堆栈最大容量即为SP的初值。
3)交换指令(XCHG) • 格式:XCHG dst , src ;(dst) (src) • 可以实现:寄存器之间 • 寄存器和存储器之间 • 注意: • 存储器之间不能直接交换; • 段寄存器不能作为操作数; • 允许字或字节操作。
2、累加器专用传送指令 • 1)输入指令(IN) • 功能:用于CPU从外设端口接收数据。 • 具体形式有四种: • IN AL, data8;从8位端口地址输入一个字节 • IN AX, data8;从8位端口地址输入一个字 • IN AL, DX;从16位端口地址输入一个字节 • IN AX, DX ; 从16位端口地址输入一个字
例1: IN AL, 80H; 从地址为80H的端口读入一个字节; 例2: MOV DX, 1020H; 将16位端口地址赋给DX IN AX, DX; 从(DX)为地址的端口读入16位数据。
8位或16位 20位 地址总线 AB CPU I/O 接 口 输 出 设 备 I/O 接 口 存 储 器 输 入 设 备 数据总线 DB 控制总线 CB • 解释: 1)CPU对各个外部设备接口也采用地址编码。 8086CPU连接外部设备的地址可以是8位或16位。
解释: 2)8086CPU访问存储器和访问外部设备采用不同的指令形式,外设地址与存储器地址可以重叠。 • 通过CPU的IO/M引脚控制存储器或外设被选通;当访问存储器时IO/M引脚输出低电平,当访问外设时该引脚输出高电平。
地址总线 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
2)输出指令(OUT) 功能:用于CPU向外设端口发送数据 四种形式: OUT data8 , AL;向8位地址端口输出一个字节 OUT data8, AX ;向8位地址端口输出一个字 OUT DX , AL;向16位地址端口输出一个字节 OUT DX , AX ;向16位地址端口输出一个字
3、目的地址传送指令 • 8086 提供三条: • LEA • LDS • LES
1)LEA (Load Effective Address) 格式: LEA reg16 , mem Reg16 — 16位通用寄存器; mem — 存储单元; 功能:将源操作数的偏移地址传送到目的操作数; 注意:源操作数必须以寄存器间接寻址、变址寻址、基址加变址寻址等方式表示的存储器操作数;目的操作数为一个16位的通用寄存器。
例: 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
2)LDS (Load pointer using DS)(略) 格式:LDS reg16 , mem ; 功能:把源操作数指定的4个相继字节的数据分别送指令指定的寄存器及DS寄存器中。 (reg16)←(mem) (DS)←((mem)+2)
3)LES (Load pointer using ES )(略) 格式:LES reg16 ,mem ; 功能:把源操作数指定的4个相继字节的数据分别送指令指定的寄存器及ES寄存器中。 (reg16)←(mem) (ES)←((mem)+2)
存储器 (DS) ... C000H:0010H 80H C0010H C0011H 01H C0012H 00H C0013H 20H ... 例: 设 (DS)=0C 000H 指令 LDS SI, [0010H] 执行指令后: (SI)=0180H (DS)=2000H
(BX) (DS) 存储器 ... B000H:080AH A2H B080AH 05H B080BH B080CH 00H B080DH 40H ... 例: 设 (DS)=B 000H (BX)=080AH 指令 LES DI, [BX] 执行指令后: (DI)=05A2H (ES)=4000H
4、标志传送指令 8086有四条标志传送操作指令: 1)LAHF(Load AH into flags) 格式:LAHF ; 功能:标志寄存器低八位传送给AH (AH)←(PSW的低字节)
2)SAHF(Store AH into Flags) 格式:SAHF 功能:AH内容传送给标志寄存器低八位。 (PSW的低字节)←(AH)
3)PUSHF(Push Flags ) 格式:PUSHF ; 功能 : 标志进栈。 (SP)←(SP)-2 ((SP)+1,(SP))←(PSW) 4)POPF(Pop Flags ) 格式:POPF; 功能:标志出栈。 (PSW)←((SP)+1,(SP)) (SP)←(SP)+2
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)加法十进制调整指令(略)
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
特点: • 可进行8位或16位的无符号数或有符号数加法运算; • 源操作数和目标操作数不能同时为存储器, 不能为段寄存器; • 指令影响标志位 • 8位(有符号)数相加,和超出范围(-128~+127),或16位(有符号)数相加,和超出范围(-32768 ~ +32767),则 O=1 • 8位(无符号)数相加,和超过255,或16位(无符号)数相加,和超过65535,则 C=1, • 其他标志(S,A,P,Z)由运算结果按定义确定。
2)含进位加法指令ADC(Add with carry) 格式: ADC dest,src ; 功能:(dest)←(dest)+(src)+C C: 进位标志C的当前值 特点: 与ADD同。 类型举例: ADC CX, 300 ADC AL, BL ADC DX, [SI]