1.26k likes | 1.39k Views
第四章 指令系统. 4.1 8086/8088指令系统概述 4.2 8086指令系统. 一、8086/8088指令系统的特点 1.指令系统的兼容性 2. 指令格式的灵活性 3. 寻址方式的多样性 4. 可对多种类型的数据进行处理 5. 可构成多处理机系统. 执行的运算 运算结果的去向 运算数据的来源. 指令中应包含的信息:. 二、指令格式. 指令: 指令是指示计算机完成特定操作的命令 指令系统: 指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。指令系统因机而异,没有通用性。. 目的操作数. 源操作数. 执行何种操作.
E N D
第四章 指令系统 4.1 8086/8088指令系统概述 4.2 8086指令系统
一、8086/8088指令系统的特点 1.指令系统的兼容性 2. 指令格式的灵活性 3. 寻址方式的多样性 4. 可对多种类型的数据进行处理 5. 可构成多处理机系统
执行的运算 运算结果的去向 运算数据的来源 指令中应包含的信息: 二、指令格式 指令:指令是指示计算机完成特定操作的命令 指令系统:指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。指令系统因机而异,没有通用性。
目的操作数 源操作数 执行何种操作 参加操作的数据 指令格式: 操作码 [操作数],[操作数] 源操作数: 指令加工之前的数据 目的操作数:指令加工之后形成的数据
指令中的操作数表征方法: 表征参加操作的数据本身 立即数 表征数据存放的地址 寄存器 存储器
操作数类型 1、立即数操作数: • 表示参加操作的数据本身,可以是8位或16位 例: MOV AX,1234H ; AX 1234H MOV BL,22H • 立即数无法作为目标操作数 • 立即数可以是无符号或带符号数,其数值应在可取值范围内
2、寄存器操作数: 表示参加运算的数存放在指令给出的寄存器中,可以是16位或8位。 例:MOV AX,BX MOV DL,CH
┇ 偏移地址 1200H 22H 11H AH AL 3、存储器操作数: • 例:MOV AX,[1200H] MOV AL, [1200H]
例如: MOV AL,[BP] 该指令生成的机器码是8A4600H
三、寻址方式 计算机可以对存储器、寄存器中的数据进行各种操作,如取数、存数、加运算、减运算等,这就需要找到数据的存放地址,再对其中的数据执行相应的操作,最后将运算结果送往指定的地址单元或寄存器。指令的寻址方式就是寻找指令操作数所在地址的方式,以确定数据的来源和去处。熟练地掌握寻址方式对学习指令系统和汇编语言程序设计具有重要作用。 下面介绍8086/8088的几种寻址方式。
例1: MOV AH,36H ; AH 立即数36H MOV CX,2A50H ; CX 立即数2A50H 1. 立即寻址 • 指令操作数部分直接给出指令的操作数,它与指令操作码相接,顺序存放在代码段中。立即数有 8位和16位之分。
注意: (1) 立即寻址方式只能用于源操作数,主要用于给寄存器赋值。 (2) 立即寻址方式不执行总线周期,执行速度快。 • 2. 寄存器寻址 • 操作数放在寄存器内,由指令直接给出某个寄存器的名字,以寄存器的内容作为操作数。 • 寄存器可以是16位的AX、BX、CX、DX、SI、DI、SP、BP寄存器,也可以是8位的AH、AL、BH、BL、CH、CL、DH、DL寄存器。
例2: MOV AX,CX DEC AL 注意: (1) 寄存器寻址方式的指令操作在CPU内部执行,不需要执行总线周期,执行速度快。 (2) 寄存器寻址方式既适用于指令的源操作数,也适用于目的操作数,并且可同时用于源操作数和目的操作数。
3. 直接寻址 • 操作数在存储器中,指令中直接给出操作数所在存储单元的有效地址EA,即段内偏移地址,表示操作数所在存储单元距离段首址的字节数。有效地址是一个无符号的16位二进制数。 例3:MOV AH,[2100H] ;将DS段中2100H单元的内 容送给AH MOV AX,[2100H] ;将DS段中2100H单元的内 容送给AL ;2101H单元的 内容送给AH。 MOV [1000H],AH ; DS:1000H←(AH)
DS=3000H MOV AX,[2000H]
注意: (1) 直接寻址方式的操作数所在存储单元的段地址一般在数据段寄存器DS中。 (2) 如果操作数在其他段,则需要在指令中用段超越前缀指出相应的段寄存器名。 例4:MOV AH, ES∶ [2000H] 将附加段寄存器ES的内容乘16,再加上2000H作为操作数所在存储单元的地址,取出该存储单元的内容送到寄存器AH中。
[SI] [DI] [BX] [BP] EA= 4. 寄存器间接寻址 • 操作数在存储器中,指令中寄存器的内容作为操作数所在存储单元的有效地址EA(偏移地址)。寄存器仅限于BX、BP,SI、DI。 • 当使用BX、SI、DI时,操作数所在存储单元的段地址存在数据段寄存器DS中 • 当使用BP时,操作数所在存储单元的段地址存在堆栈段寄存器SS中。
例5:已知: DS=2100H,DI=2000H 指令: MOV AX,[DI] 解: 物理地址=16×DS+DI =16×2100H+2000H=23000H 指令执行结果是将23000H和23001H单元的内容送入寄存器AX中。 注意: 1. 只有SI,DI,BX,BP 可作为间址寄存器。2. 若操作数所在存储单元不在数据段DS中,需要在指令中用段超越前缀表明其所在段的段名。
[BX] 8位或16位 [BP] 位移量 EA= + 5. 基址寻址 • 操作数在存储器内,指令中寄存器(BX或BP)的内容与指令指定的位移量之和作为操作数所在存储单元的有效地址EA(偏移地址)。 • 使用BX时,段地址为DS的内容; 使用BP时,段地址为SS的内容。
例6: SS=2000H,BP=1000H,COUNT=2000H (16位偏移量) 指令: MOV AX,COUNT[BP] 解:物理地址=16×SS+BP+16位偏移量 =20000H+1000H+2000H=23000H 指令执行结果是将23000H和23001H单元的内容送入寄存器AX中。 MOV BL,2[BX] 或 MOV BL,[BX+2] ;(DS:[BX+2])BL
[SI] 8位或16位 [DI] 位移量 EA= + 6. 变址寻址 • 操作数在存储器内,指令将变址寄存器SI、DI内容与指令指定的位移量之和作为操作数所在存储单元的有效地址EA(偏移地址)。段地址规定为DS的内容。 例7:DS=3000H,SI=1000H,COUNT=2000H 指令: MOV AX,COUNT[SI] 解:物理地址=16×DS+SI+16位偏移量 =30000H+1000H+2000H=33000H 指令执行结果是将33000H和33001H单元的内容送入寄存器AX中。
MOV AX,2[DI];AX← (DS:(DI)+2) MOV AX,[DI+2];AX← (DS:(DI)+2) MOV BX,COUNT [SI]
[BX] [SI] 8位或16位 [BP] [DI] 位移量 EA= + + 7. 基址加变址寻址 • 操作数在存储器内。指令将基址寄存器BX、BP与变址寄存器SI、DI的内容之和再加上偏移量(8位或16位),得到操作数所在存储单元的有效地址EA。 • 当使用BX时,段寄存器为DS。 当使用BP时,段寄存器为SS。
例8:已知: DS=2000H,BX=1000H, SI=0500H,MK=1120H 指令: MOV AX, [MK+BX+SI] 解: 物理地址=20000H+1000H+0500H +1120H =22620H 指令执行结果是 将22620H、22621H单元 的内容送入寄存器AX中。
8.字符串寻址 • 用于字符串操作指令。规定变址寄存器SI中的内容是源数据串的段内偏移地址,而变址寄存器DI中的内容是目标数据串的段内偏移地址。 • 源数据串的段地址规定是数据段DS,目标数据串的段地址规定是附加段ES。指令执行后SI和DI的内容自动增量(或减量),增(或减)值为1或2。 • 例 : MOVSB • 执行后: [DI]←[SI] SI←SI±1 DI←DI±1
9. I/O端口寻址 • 寻找输入输出设备的端口地址,可分为直接端口寻 址和间接端口寻址。 • 直接端口寻址:由指令直接给出I/O设备的端口地址。 • 它规定端口地址为8位,能寻址256 个端口 • 间接端口寻址:由DX给出I/O设备的端口地址。由于DX • 是16位,因此间接端口寻址能寻址多达64K • 个端口。 例:IN AL,20H ;将地址为20H的外设内容读入AL中 OUT DX,AL;AL中内容输出给以DX的内容为地址 的外设
10、隐含寻址 指令隐含了的一个或两个操作数的地址,即操作数在默认的地址中。 例: AAA; 对AL中的内容进行十进制加法调整,并 把调整后的结果放入AH和AL中。这条指令的隐含操作数是AH和AL。
例:设BX=0158H, DI=10A5H, 位移量=1B57H, DS=2100H,求各寻址方式下的有效地址和物理地址。 1)直接寻址 MOV AX,[1B57H] 有效地址=1B57H 物理地址=21000H+1B57H=22B57H 2)寄存器间接寻址 MOV AX, [BX] 有效地址=0158H 物理地址=21000H+0158H=21158H 3)基址寻址 MOV AX, [BX+1B57H] 有效地址=0158H+1B57H=1CAFH 物理地址=21000H+1CAFH=22CAFH 4)变址寻址 MOV AX,[DI+1B57H] EA=10A5H+1B57H=2BFCH 物理地址=21000H+2BFCH=23BFCH 5)基址加变址寻址 MOV AX,[BX+DI+1B57H] EA= 0158H+10A5H+1B57H=2D54H 物理地址=21000H+2D54H=23D54H
4.2 8086的指令系统 指令系统包括九大类、133种基本指令,通过寻址方式的变化与数据形式(字节、字型)的组合,可构成上千条指令。指令系统按功能分为数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理机控制、输入输出、中断等,本节将分别说明。
4.2.1数据传送指令 数据传送类指令实现CPU内部寄存器之间、CPU与存储器之间、CPU与I/O端口之间的数据传送。 1. 通用数据传送指令 包括 MOV、进栈、出栈指令、交换指令和换码指令。 (1)一般数据传送指令 MOV(8位/16位) 格式:MOV OP目,OP源 功能: OP源 OP目 要求:OP目 可以是寄存器(除CS外)、存储器 OP源可以是寄存器、存储器和立即数
例: MOV AL,BL ; BL寄存器的内容送AL MOV SP,2AC0H ; 立即数2AC0H送SP MOV [DI],AX ; AX中的16位数送DI和DI+1单元 MOV SI,ES:[BP] ; 附加段中BP所指向的两个单 元的内容送SI寄存器 MOV WORD PTR [SI],6070H
注意: • MOV指令的两个操作数(源、目的)均可采用不同的寻址方式。 • 源操作数和目的操作数的类型必须一致 • 不允许把立即数作目的操作数,也不允许向段寄存器送立即数。 • 不允许在段寄存器之间、存储器单元之间传送数据。 • CS、IP寄存器不能用作目的操作数。 MOV CS,AX ╳ • 一般传送指令不影响标志位。
√ √ √ √ √ × 类型不一致 √ √ × 类型不一致 √ √ √ × 类型不一致 √ × 立即数不能送段寄存器 √ √ × 类型不一致 √ × 立即数不能送段寄存器 √ √ √ × 类型不一致 √ × 立即数不能送段寄存器 √ × CS不能作目的操作数 √ √ × 类型不一致 √ × 立即数不能送段寄存器 √ × CS不能作目的操作数 √ √ √ × 类型不一致 √ × 立即数不能送段寄存器 √ × CS不能作目的操作数 √ × 不能同时为存储器操作数 √ √ × 类型不一致 √ × 立即数不能送段寄存器 √ × CS不能作目的操作数 √ × 不能同时为存储器操作数 × 目的不能为立即数 例:判断下列指令正确与否: MOV AL, BL MOV CX, BX MOV BX, DL MOV DX, 34H MOV DS, 1234H MOV ES, AX MOV CS, BX MOV [SI], CX MOV [DI], [SI] MOV 2000H, AX
(2) 堆栈操作指令 堆栈:是按“后进先出”原则工作的一段存储器区域。堆栈寄存器SS——段地址 堆栈指针SP——始终当前栈顶所在的存储单元地址, 即最新入栈数据所在的存储单元的地址。 • 压栈操作:PUSH OP 功能:把OP字数据压入栈中,结果SP-2SP 原则:高字节压在高地址,低字节压在低地址 执行过程: SP←SP-1; [SP] ←OPH SP←SP-1 ; [SP] ←OPL
例:PUSH AX • SP-1 SP,压AH • (2) SP-1 SP,压AL SP SP-1 SP AL SP SP-1 AH SP
SP AL DX DH DL AH AH AL • 出栈操作: POP OP 功能:从栈中弹出数据 OP,结果SP+2SP 执行过程: OPL ←[SP]; SP←SP+1 OPH←[SP] ; SP←SP+1 • 例:POP DX • 弹出AL DL, SP+1 SP (2) 弹出AH DH, SP+1 SP SP SP+1 SP SP+1 SP
例:已知: AX=1122H,BX=3344H,SP=1010H 执行指令: PUSH AX PUSH BX POP AX POP BX 执行后AX,BX,SP的结果? 解:执行结果为 AX=3344H BX=1122H SP=1010H
注意: • 堆栈操作总是按字进行的。 • 压入指令,SP-2,数据在栈顶。弹出指令正好相反。 • 操作数可以是存储器、寄存器或段寄存器操作数( CS不能用于POP ),不能是立即数。 PUSH CS √ POP CS × PUSH 1200H × POP 2300H × • 这两条指令主要用来进行现场保护和恢复,以保证子程序调用或中断程序的正常返回。
(3) 数据交换指令(8/16位) 格式: XCHG OP1,OP2 功能:实现OP1和OP2内容的相互交换。 操作数:通用寄存器或存储器,但不能均为内存 单元。 注意: 段寄存器和IP不能作为交换指令的操作数。 例:XCHG AX, BX √ XCHG BH, BL √ XCHG AX, 1122H × XCHG DS, AX × XCHG [SI], BP √ XCHG [SI], [DI] ×
格式: XLAT 功能:[BX+AL] AL EA 说明:将BX和AL内容相加作为有效地址EA,在一个表格中找出此单元中的内容AL中。 BX——表格的首地址 AL——相对于表格首地址的位移量(要转换的代码) (4) 换码指令(查表指令、翻译指令) 换码指令是一条完成字节翻译功能的指令。它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。 46
注意: 1. 使用前,先建立被转换代码(字节型)的数据表。 2. 换码指令只能使用寄存器BX、AL,不影响标志位。
‘0’ 30 42000H+0 ‘1’ 31 ‘2’ 32 ... 39 ‘9’ 42000H+9 41 ‘A’ 42 ‘B’ ... 45 ‘E’ ‘F’ 46 ... 例:数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第9个代码的ASCII码(设DS=4000H)。 可用如下指令实现: MOV BX,2000H ;BX←表首地址 MOV AL,09H ;AL←序号 XALT ; 查表转换 执行后得到:AL=39H
(1)取有效地址EA指令:格式:LEA OP目, OP源 功能:将源操作数的有效地址EA送到目的操作数。例: LEA AX,[5678H]; AX ← 5678HLEA BX,[BP+SI];BX ←BP+SI 2. 目标地址传送指令 • 此类指令的功能是将操作数所在存储器的地址送入目标寄存器。 • 注意: 1. OP源必须是存储器操作数, OP目必须是16位的通用寄存器 。 2. 地址传送指令不影响状态标志位。
符号地址 注意区分下列指令: LEA SI,DATA1 MOV SI,DATA1 MOV SI, OFFSET DATA1 MOV BX,[BX] LEA BX,[BX] ┇ DATA1 34H 12H ┇ 1100H 88H 77H ┇ BX=1100H
2130H 2131H 2132H 2133H 34H 12H 78H 56H DI=1234H DS=5678H (2)指针送寄存器和DS指令 格式:LDS OP目,OP源 功能:把OP源指定的4个字节内容取出,低地址的两字节OP目,高地址的两字节DS。 例:LDS DI,[2130H];2130H和2131H单元中的内容DI;2132H和2133H单元中的内容DS
┇ 1200H 34H 数据段 1 12H 00H 60H ┇ AX DI 数据段2 22 33 12 34 61234H 33H 22H ┇ 例:下列指令执行后DI ,AX的值是多少? LDS DI,[1200H] MOV AX,[DI] 结果:DI = 1234H AX = 2233H
2130H 2131H 2132H 2133H 34H 12H 78H 56H DI=1234H ES=5678H (3)指针送寄存器和ES指令 格式:LES OP目,OP源 功能:本指令与LDS指令的操作基本相同,所不同的是将OP源4个字节中高地址的两字节ES。 例:LES DI,[2130H]; 2130H和2131H单元中的内容DI; 2132H和2133H单元中的内容ES