第2章 汇编语言与汇编程序 ——8086/8088指令系统 mov ax,12h call display Jmp 1234h
主要内容: 指令系统的一般概念 对操作数的寻址方式 六大类指令的操作原理: 操作码的含义 指令对操作数的要求 指令执行的结果
3.1 概述 8088/8086指令系统: (1)指令向后兼容(x86系列) (2)应用广泛,资料易于寻找 3.1 概述 指令——控制计算机完成指定操作的命令 机器指令——指令的二进制代码形式。例如:CD21H 汇编指令——助记符形式的指令。例如:INT 21H 指令系统——CPU所有指令及其使用规则的集合 8088/8086指令系统: (1)指令向后兼容(x86系列) (2)应用广泛,资料易于寻找
指令按功能分为六大类(92种) (1)数据传送类; (2)算术运算类; (3)逻辑运算和移位; (4)串操作; (5)控制转移类; (6)处理器控制。
3.1.1 指令的基本构成 目的 源 操作码 [操作数], [操作数] 说明要执行的是什么操作 操作对象,可以有0个、1个或2个
指令举例: MOV AX , BX 操作码 操作数 ADD AX,[SI+6] INC [BX] HLT
部分8088常用指令 指令类型 助记符 数 据 传 送 数据传送 MOV,PUSH/POP,XCHG等 地址传送 LEA,LDS,LES 输入输出 IN,OUT 算 术 运 加法 ADD,ADC,INC 减法 SUB,SBB,DEC,NEG,CMP 乘/除法 MUL,IMUL,DIV,IDIV 逻辑 AND,OR,NOT,XOR,TEST 移位 SHL/SHR/SAR,ROL/ROR,RCL/RCR 串操作 MOVS,CMPS,SCAS,LODS,STOS 控制转移 JMP,JXX,LOOP,CALL/RET,INT/IRET
8088/8086的操作数分为3类 1、立即数(常数) 立即数只能用作源操作数,如 取值范围如下表: 8位 16位 无符号数 00H-FFH(0-255) 0000H-FFFFH(0-65535) 带符号数 80H-7FH(-128~127) 8000H-7FFFH(-32768~32767) 立即数只能用作源操作数,如 MOV AX,0FA00H ;正确 MOV 8000H,DX ;错误
2、寄存器操作数 放在8个通用寄存器或4个段寄存器中的操作数
SI DI 只能存放字操作数 BP SP CS 段寄存器存放当前操作数的段基地址 DS ES SS 不允许将立即数传送到段寄存器
3、存储器操作数 类型 存储单元个数 字节 字 双字 1 2 4 存储器操作数 一般不允许两个操作数同时为存储器操作数
存储单元的物理地址 = 段基地址 + 偏移地址 若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。 表3.3 段寄存器使用的一些基本约定 存储器操作数的偏移地址(也称有效地址)可以通过不同的寻址方式由指令给出。 例如,若(BX)=2000H, (SI)=0A00H, (DI)=2A00H,则以下指令的结果是一样的: MOV AL, [2A00H] MOV AL, [BX+0A00H] MOV AL, [BX][SI] MOV AL, [DI]
3.1.2 指令的执行时间 一条指令的执行时间=∑ 单位用时钟周期数表示 结论: 1)尽量使用寄存器作为操作数 3.1.2 指令的执行时间 取指令 取操作数 执行指令 传送结果 一条指令的执行时间=∑ 单位用时钟周期数表示 表3.4 常用指令执行时间 结论: 1)尽量使用寄存器作为操作数 2)若有可能,用移位代替乘除法 3)尽量使用简单的寻址方式
3.2 8086的寻址方式 寻址方式——寻找操作数的方法 寻找操作数的地址(一般指源操作数) 寻找要执行的下一条指令的地址 3.2 8086的寻址方式 寻址方式——寻找操作数的方法 寻找操作数的地址(一般指源操作数) 寻找要执行的下一条指令的地址 在8086指令系统中,说明操作数所在地址的寻址方式可分为8种: ①立即寻址 ⑤ 寄存器相对寻址 ②直接寻址 ⑥基址-变址寻址 ③寄存器寻址 ⑦相对的基址-变址寻址 ④寄存器间接寻址 ⑧隐含寻址
3.1.2 立即寻址 操作数(为一常数)直接由指令给出 (此操作数称为立即数) 立即寻址只能用于源操作数 例: MOV AX, 1C8FH 3.1.2 立即寻址 操作数(为一常数)直接由指令给出 (此操作数称为立即数) 立即寻址只能用于源操作数 例: MOV AX, 1C8FH MOV BYTE PTR[2A00H], 8FH 错误例: × MOV 2A00H, AX ; 错误!
指令操作例:MOV AX,3102H ; AX 3102H 执行后,(AH) = 31H,(AL) = 02H 存储器 02H 31H AX 立即寻址指令在存储器中的存放形式 AH AL MOV操作码 操作码 代码段 立即数 02H 低8位 代码段 高8位 31H
3.2.2 直接寻址 指令中直接给出操作数的16位偏移地址 偏移地址也称为有效地址(EA, Effective Address) 3.2.2 直接寻址 指令中直接给出操作数的16位偏移地址 偏移地址也称为有效地址(EA, Effective Address) 默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀 偏移地址也可用符号地址来表示,如ADDR、VAR 例: MOV AX , [2A00H] MOV DX , ES: [2A00H] MOV SI , TABLE_PTR
. 指令操作例:MOV AX,[3102H] AL (3102H) , AH (3103H) MOV操作码 02H 31H AH AL 如果(DS)=2000H, (23012H) = CDH, (23013H) = ABH 则操作数的物理地址为: 20000H+3102H = 23102H 指令执行后:(AX) = ABCDH 存储器 MOV操作码 代码段 02H 31H AH AL . 数据段 23102H CDH ABH
3.2.3 寄存器寻址 操作数放在某个寄存器中 源操作数与目的操作数字长要相同 寄存器寻址与段地址无关 例: MOV AX, BX 3.2.3 寄存器寻址 操作数放在某个寄存器中 源操作数与目的操作数字长要相同 寄存器寻址与段地址无关 例: MOV AX, BX MOV [3F00H], AX MOV CL, AL 错误例: × MOV AX, BL ; 字长不同 × MOV ES: AX, DX ; 寄存器与段无关
指令操作例:MOV SI,AX ; SI (AX) 指令执行前:(AX)=2233H 指令执行后:(AX)=2233H,(SI)=2233H
3.2.4 寄存器间接寻址 EA = 操作数的偏移地址(有效地址EA)放在寄存器中 只有SI、DI、BX和BP可作间址寄存器 错误例 : 3.2.4 寄存器间接寻址 操作数的偏移地址(有效地址EA)放在寄存器中 只有SI、DI、BX和BP可作间址寄存器 例: MOV AX, [BX] MOV CL, CS:[DI] 错误例 : × MOV AX, [DX] × MOV CL, [AX] (BX) (BP) (SI) (DI) EA =
60000 61200 指令操作例:MOV AX,[SI] 44H 33H 6000 1200 DS SI AX 存储器 数据段 若 (DS)=6000H, (SI)=1200H, (61200H)=44H, (61201H)=33H 则指令执行后,(AX)=3344H。 44H 33H 6000 1200 DS SI 60000 61200 61200H AX 存储器 数据段 +)
3.2.5 寄存器相对寻址 + 位移量 EA = EA=间址寄存器的内容加上一个8/16位的位移量 8位 16位 3.2.5 寄存器相对寻址 EA=间址寄存器的内容加上一个8/16位的位移量 (BX) (BP) (SI) (DI) 8位 16位 + EA = 位移量 寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)
MOV AX, [BP+1000H] ; 默认段寄存器为SS 指令操作例:MOV AX,DATA[BX] 例: MOV AX, [BX+8] MOV CX, TABLE[SI] MOV AX, [BP+1000H] ; 默认段寄存器为SS 指令操作例:MOV AX,DATA[BX] 若(DS)=6000H, (BX)=1000H, DATA=2A00H, (63A00H)=66H, (63A01H)=55H 则物理地址 = 60000H + 1000H + 2A00H = 63A00H 指令执行后:(AX)=5566H (见下页图示)
. DS 6000 BX 1000 + DATA 2A00 . 63A00 63A00H . MOV AX,DATA[BX] 操作码 代码段 BX 1000 00 偏移量低 2A 偏移量高 + DATA 2A00 . 63A00 63A00H 66H 数据段 55H AX AH AL .
3.2.6 基址-变址寻址 + EA = 若操作数的偏移地址: 由基址寄存器(BX或BP)给出 —— 基址寻址方式 3.2.6 基址-变址寻址 若操作数的偏移地址: 由基址寄存器(BX或BP)给出 —— 基址寻址方式 由变址寄存器(SI或DI)给出 —— 变址寻址方式 由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。 (BX) (BP) (SI) (DI) + EA = 同一组内的寄存器不能同时出现。
例: MOV AX, [BX] [SI] MOV AX, [BX+SI] MOV AX, DS: [BP] [DI] 错误例: × MOV AX, [BX] [BP] × MOV AX, [DI] [SI]
指令操作例:MOV AX,[BX][SI] 假定:(DS)=8000H, (BX)=2000H, SI=1000H 则物理地址 = 80000H + 2000H + 1000H = 83000H 指令执行后: (AL)=[83000H] (AH)=[83001H] . DS 8000 操作码 代码段 BX 2000 + SI 1000 . 83000 83000H YY 数据段 XX AX AH AL .
3.2.7 相对的基址-变址寻址 + + 位移量 EA = 在基址-变址寻址的基础上再加上一个相对位移量 注意事项同基址-变址寻址 (BX) (BP) (SI) (DI) 8位 16位 + + EA = 位移量 例: MOV AX,BASE [SI] [BX] MOV AX,[BX+BASE] [SI] MOV AX,[BX+SI+BASE] MOV AX,[BX] BASE [SI] MOV AX,[BX+SI] BASE
指令操作例:MOV AX,DATA[DI][BX] 若(DS)=8000H, (BX)=2000H, (DI)=1000H, DATA=200H 则指令执行后(AH)=[83021H], (AL)=[83020H] . DS 8000 操作码 BX 2000 代码段 DI 1000 + DATA 0200 . 83200 83200H YY 数据段 XX . AX AH AL
使用相对的基址-变址寻址方式可以很方便地访问二维数组。 位移量 数组首地址 (偏移地址) 基址寄存器 数组元素行址 (行位移地址) 变址寄存器 数组元素列址 (行内元素下标) 二维数组例:内存图示(按行存储) 1 8 3 2 5 2 4 0 9 A =
3.2.8 隐含寻址 (AL)×(BL)→AX 指令操作数是隐含的,在指令中未显式地指明。 例:MUL BL 指令隐含了被乘数AL及乘积AX 3.2.8 隐含寻址 指令操作数是隐含的,在指令中未显式地指明。 例:MUL BL 指令隐含了被乘数AL及乘积AX 类似的指令还有:DIV、CBW、MOVS等 (AL)×(BL)→AX
小结 指令由( )和( )构成 操作码 操作数 如何取得操作数——称为( ) 寻址方式
立即寻址 直接寻址 寄存器寻址 寻址方式可分为 寄存器间接寻址 寄存器相对寻址 基址-变址寻址 基址-变址相对寻址
寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较: 寻址方式 指令操作数形式 寄存器间接 只有一个寄存器(BX/BP/SI/DI之一) 寄存器相对 一个寄存器加上位移量 基址—变址 两个不同类别的寄存器 相对基址-变址 两个不同类别的寄存器加上位移量