第五讲 授课教师 : 陆俊林王箫音 2012 年春季学期
主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 4 章寻址方式与指令系统 1
主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 2
指令的组成 指令由操作码和操作数两部分组成 操作码操作数 MOV AX, 8726H ADD AX, [3000H] MOV CX, [BX+SI+200H] JMP [BX] 大多数情况下, 指令中并不直接给出操作数 该划分仅为示意图, 在真实的指令机器码中, 操作码和操作数的划分方式较为复杂 3
寻址方式 (Addressing Mode) 数据寻址方式 : 指令中如何提供操作数或操作数地址的方式 转移地址寻址方式 : 程序非顺序执行时如何寻找转移地址 MOV AX, 8726H ADD AX, [3000H] MOV CX, [BX+SI+200H] JMP [BX] 给出存放部分转 移地址的地址 直接给出操作数 给出存放操作数的地址 给出计算操作数地址的方法 * 此处仅指出了源操作数的寻址方式, 而目的操作数也有类似的各种寻址方式 4
主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 5
数据寻址方式的分类 1 立即寻址 2 寄存器寻址 3 直接寻址 4 寄存器间接寻址 5 寄存器相对寻址 6 基值变址寻址 7 相对基址变址寻址 8 比例变址寻址 数据在指令中数据在寄存器中 数据在存储器中 6
1. 立即寻址 (Immediate Addressing) 操作数作为指令机器码的一部分, 在取出指令的同时就取出了操作数 汇编指令 MOV AX, 8726H 机器码 10111000... 高地址 存储器 8726H AX 87H 26H 操作数 10111000 操作码 低地址 7
要点说明 立即寻址方式中的操作数称为立即数 立即数可以是 8 位或 16 位,IA-32 中可以使用 32 位的立即数 多字节的立即数遵循 高位字节存放在高地址中, 低位字节存放在低地址中 的原则 立即寻址方式常用于给寄存器赋值, 并且只能用于源操作数, 而不能用于目的操作数 由于不需要存储器访问, 该方式的指令执行速度很快, 但需占用较多的指令字节 8
错误的立即寻址指令示例 1. MOV AL, 256 2. MOV AX, -32769 立即数超过了 AL 能存放的数的范围 (256=100H) 立即数超过了 AX 能存放的带符号数范围 (-32768~32767) 3. MOV 100H, AL 立即数不能作为目的操作数 4. DEC 20 单操作数指令不能使用立即数 5. MOV DS, 1234H 源操作数是立即数, 则目的操作数就不能是段寄存器 9
2. 寄存器寻址 (Register Addressing) 操作数在寄存器中, 指令中指明寄存器号 汇编指令 MOV AX, BX 机器码 1000101111000011 1234H 5678H 5678H 5678H AX BX AX BX 执行前 执行后 10
要点说明 寄存器寻址方式既可用于源操作数, 也可用于目的操作数, 还可以两者都用 对于 8 位操作数, 可使用如下寄存器 : AH AL BH BL CH CL DH DL 对于 16 位操作数, 可使用如下寄存器 : AX BX CX DX SI DI SP BP CS DS ES SS (CS 不能作目的寄存器 ) 11
寄存器寻址的优点 执行速度快 操作数在 CPU 内部, 不需要访问存储器来取得操作数 指令编码较短 寄存器号比立即数 内存地址短 * 在编程中, 应尽量使用这种寻址方式的指令 12
3. 直接寻址 (Direct Addressing) 指令中直接给出操作数的有效地址, 有效地址指向存放在存储器中的操作数 即 : 操作数的有效地址 ( 而不是操作数本身 ) 存放在代码段中指令的操作码之后 注 : 有效地址 (EA,Effective Address) 在讨论寻址方式时, 通常把操作数的偏移地址称为有效地址 操作数默认存放在数据段中 13
寻址方式示例 高地址 23001H 23000H 20000H 低地址 存储器 20H 10H 30H 00H OP 汇编指令 MOV AX, [3000H] 操作数 操作码 数据段 代码段 2010H AX 操作数默认存放在 DS 指向的数据段中, 即 [3000H]=DS:[3000H] 设 :DS=2000H, 则 : 物理地址 =2000H 16+3000H =23000H 14
要点说明 如果数据存放在数据段以外的其它段 ( 例如附加段 ), 则应在指令中给出 段跨越前缀 示例 1:MOV AX, ES:[3000H] 示例 2:ES: MOV AX, [3000H] 为避免指令字过长, 规定双操作数指令不能两个操作数都用直接寻址方式 错误示例 :MOV DS:[2000H], DS:[3000H] 15
4. 寄存器间接寻址 (Register Indirect Addressing) 指令中给出寄存器号, 指定的寄存器中存放着操作数的有效地址 高地址 21001H 21000H 20000H 低地址 存储器 50H A0H 数据段 汇编指令 MOV AX, [BX] 设 :DS=2000H, BX=1000H 则 : 物理地址 =2000H 16+1000H =21000H 50A0H AX 16
要点说明 默认的段寄存器 ( 即未使用 段跨越前缀 的情况 ) 8086 IA-32 新增 保存有效地址的寄存器 段寄存器 BX, SI, DI DS BP SS EAX, EBX, ECX, EDX, ESI, EDI DS EBP, ESP SS 17
5. 寄存器相对寻址 (Register Relative Addressing) 操作数的有效地址是一个基址或变址寄存器的内容与一个 8 位或 16 位的位移量之和 有效地址 = BX BP SI DI + 8 位 16 位 ( 带符号数 ) 基址或变址 位移量 18
寻址方式示例 高地址 45001H 45000H 40000H 代码段低地址 存储器 12H 34H 30H 00H OP OP 汇编指令 数据段 位移量 操作码 1234H AX MOV MOV AX, [SI+3000H] AX, 3000H[SI] 设 :DS=4000H SI=2000H 则 : 有效地址 =2000H+3000H =5000H 物理地址 =40000H+5000H =45000H 19
要点说明 默认的段寄存器 ( 即未使用 段跨越前缀 ) 寄存器 BX/SI/DI 对应的段寄存器为 DS 寄存器 BP 对应的段寄存器为 SS IA-32 的扩展 允许使用任何 32 位通用寄存器 位移量可以是 8 16 32 位带符号数 适用于表格 ( 数组 ) 的处理 通过位移量来设置表格的首地址 修改基址或变址寄存器的内容来获得表项的值 20
6. 基址变址寻址 (Based Indexed Addressing) 操作数的有效地址是一个基址寄存器和一个变址寄存器内容之和, 两个寄存器均由指令指定 有效地址 = BX BP + SI DI 基址 变址 21
寻址方式示例 高地址 数据段 存储器 21001H 56H 21200H 78H [SI] 21000H [BX] 20000H [DS] 低地址 汇编指令 5678H AX MOV MOV AX, [BX+SI] AX, [BX][SI] 设 :DS=2000H BX=1000H SI=200H 则 : 有效地址 =1000H+200H =1200H 物理地址 =20000H+1200H =21200H 22
要点说明 默认的段寄存器 ( 即未使用 段跨越前缀 ) 寄存器 BX 对应的段寄存器为 DS 寄存器 BP 对应的段寄存器为 SS IA-32 的扩展 允许使用任何两个 32 位通用寄存器的组合 例外 : 变址寄存器不得使用 ESP 适用于表格 ( 数组 ) 的处理, 且更灵活 表格首地址的偏移量可存放在基址寄存器中 用变址寄存器来访问表格中的各项 23
7. 相对基址变址寻址 (Relative Based Indexed Addressing) 操作数的有效地址是一个基址寄存器的内容 一个变址寄存器的内容与一个 8 位或 16 位的位移量之和 也称 带位移量的基址加变址寻址方式 有效地址 = BX BP + SI DI + 8 位 16 位 ( 带符号数 ) 基址变址位移量 24
寻址方式示例 高地址 23001H 23200H 20000H 低地址 存储器 12H 34H 汇编指令 数据段 1234H AX MOV MOV MOV AX, [BX+SI+DISP] AX, DISP[BX][SI] AX, DISP[BX+SI] 设 :DS=2000H, BX=1000H SI=2000H, DISP=200H 则 : 有效地址 =1000H+2000H+200H =3200H 物理地址 =20000H+3200H =23200H 25
要点说明 (1) 默认的段寄存器 ( 即未使用 段跨越前缀 ) 寄存器 BX 对应的段寄存器为 DS 寄存器 BP 对应的段寄存器为 SS IA-32 的扩展 允许使用任何两个 32 位通用寄存器的组合 ( 例外 : 变址寄存器不得使用 ESP) 位移量可以是 8 16 32 位带符号数 26
要点说明 (2) 适用于访问二维数组 数据存放方式 数组元素在内存中按行顺序存放 首先放第一行所有元素, 再放第二行所有元素, 以此类推 数据访问方式 位移量设为数组起始地址的偏移量 保持基址 ( 如 BX) 不变, 而变址 ( 如 SI) 改变, 可以访问同一行的所有元素 保持变址 ( 如 SI) 不变, 而基址 ( 如 BX) 改变, 可以访问同一列的所有元素 27
8. 比例变址寻址 (Scaled Indexed Addressing) 操作数的有效地址由基址寄存器 变址寄存器 比例因子和位移量按如下公式生成 有效地址 = EAX EBX ECX EDX ESP EBP ESI EDI 基址 + EAX EBX ECX EDX EBP ESI EDI 变址 1 2 4 8 比例因子 + 8 位 16 位 32 位 ( 带符号数 ) 位移量 28
通用公式 比例变址寻址是 IA-32 新增的寻址方式 提供了存储器操作数寻址方式的通用公式 寄存器间接寻址 有效地址 = 基址变址寻址 EAX EBX ECX EDX ESP EBP ESI EDI + EAX EBX ECX EDX EBP ESI EDI 基址 变址 比例 因子 1 2 4 8 + 8 位 16 位 32 位 ( 带符号数 ) 位移量 29
寻址方式示例 (1) MOV AL, ARRAY[EBX][ESI] 把数据段中一字节单元的内容传到 AL 该字节单元的有效地址为 EBX+ESI+ARRAY MOV CX, [EAX+2*EDX] 把数据段中一字单元的内容传到 CX 该字单元的有效地址为 EAX+2*EDX 30
寻址方式示例 (2) MOV EBX, [EBP+ECX*4+20H] 把堆栈段中一双字单元的内容传到 EBX 该双字单元的有效地址为 EBP+ECX*4+20H MOV EDX, ES:ARRAY[4*EBX] 把附加段中一双字单元的内容传到 EDX 该双字单元的有效地址为 4*EBX+ARRAY 31
要点说明 (1) 默认的段寄存器 ( 即未使用 段跨越前缀 ) 寄存器 ESP 和 EBP 对应的段寄存器为 SS 其它寄存器对应的段寄存器为 DS 位移量 对于 16 位寻址, 可以是 8 位或 16 位带符号数 对于 32 位寻址, 可以是 8 位或 32 位带符号数 32
要点说明 (2) 适用于访问具有不同元素长度的二维数组 数据访问方式 基址寄存器 : 数组行下标 一行所占字节数 变址寄存器 : 数组列下标 比例因子 : 数组元素的字节长度 位移量 : 数组起始地址的偏移量 33
主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 34
转移地址寻址方式 转移地址寻址方式, 指程序非顺序执行时如何寻找转移地址 直接转移 间接转移 段内转移 段内直接寻址 段内间接寻址 段间转移 段间直接寻址 段间间接寻址 35
相关术语 (1) 段内转移 ( 近转移 ) 转移地址与该转移指令在同一代码段 高地址 存储器 JMP 当前指令 转移地址只包含偏移地址部分 找到转移地址后, 将转移地址送入 IP (CS 内容不必改变 ) 低地址 XX 下一指令 代码段 36
相关术语 (2) 段间转移 ( 远转移 ) 转移地址与该转移指令位于不同的代码段 高地址 存储器 XX 下一指令 转移地址包含偏移地址和段基值两部分 找到转移地址后, 将段基值送入 CS, 将偏移地址送入 IP 低地址 JMP 代码段 2 当前指令代码段 1 37
相关术语 (3) 直接转移 转移地址直接放在指令中 根据转移地址是绝对地址还是相对地址, 分别称为绝对转移和相对转移 间接转移 转移地址在寄存器或存储器中, 未包含在指令之中 通过寄存器寻址或存储器寻址的方式获得转移地址 38
1. 段内直接寻址 ( 直接近转移 ) 指令的汇编形式 转移地址直接包含在转移指令中 转移地址通常采用符号地址形式, 也称近标号 转移地址左边加上类型说明 NEAR PTR 或 SHORT 指令的机器码形式 机器码中存放转移地址与当前 IP 值的差 ( 称为位移量 ) 位移量放在转移指令的操作码之后 39
示例 JMP NEAR PTR PROG1 JMP SHORT LAB PROG1:MOV CX, DX LAB: ADD AX, BX LAB-IP =2300AH-(23004H+2) =04H PROG1-IP =23006H-(21000H+3) =2003H 存储器 高地址 2300AH ADD LAB 23006H MOV PROG1 04H 23004H JMP 21002H 20H 21001H 03H 21000H JMP 低地址 40
2. 段内间接寻址 ( 间接近转移 ) 1 转移地址 ( 偏移地址部分 ) 在寄存器中, 采用寄存器寻址方式获得转移地址 示例 :JMP BX; BX 的内容为转移地址 2 转移地址 ( 偏移地址部分 ) 在数据存储单元中, 获得转移地址的方式包括 : a) 直接寻址 b) 寄存器间接寻址 c) 寄存器相对寻址 d) 基址变址寻址 e) 基址变址相对寻址 41
a) 直接寻址 特征 : 数据存储单元地址在指令中直接给出 存储器 高地址 数据段 80021H 30H 80020H 06H 示例 :JMP DS:[20H] 8000H DS 23006H XX 下一指令 21000H JMP 当前指令 低地址 代码段 3006H IP 2000H CS 42
b) 寄存器间接寻址 特征 数据存储单元的偏移地址在 BX BP SI DI 中 示例 JMP [BX]; 数据存储单元 (DS:BX) 的一个字为转移地址 JMP [BP]; 数据存储单元 (SS:BP) 的一个字为转移地址 JMP DS:[BP]; 数据存储单元 (DS:BP) 的一个字为转移地址 43
c) 寄存器相对寻址 特征 数据存储单元的偏移地址是寄存器 (BX BP SI DI) 的内容与位移量的和 示例 JMP [BX+20]; 数据存储单元 (DS:BX+20) 的一个字为转移地址 JMP [BP+20]; 数据存储单元 (SS:BP+20) 的一个字为转移地址 JMP DS:[BP+20]; 数据存储单元 (DS:BP+20) 的一个字为转移地址 44
d) 基址变址寻址 特征 数据存储单元的偏移地址是基址寄存器 (BX BP) 和变址寄存器 (SI DI) 的内容之和 示例 JMP [BX+SI]; 数据存储单元 (DS:BX+SI) 的一个字为转移地址 JMP [BP+SI]; 数据存储单元 (SS:BP+SI) 的一个字为转移地址 JMP DS:[BP+SI]; 数据存储单元 (DS:BP+SI) 的一个字为转移地址 45
e) 基址变址相对寻址 特征 数据存储单元的偏移地址是基址寄存器 (BX BP) 的内容 变址寄存器 (SI DI) 的内容及位移量的和 示例 JMP [BX+SI+20]; 数据存储单元 (DS:BX+SI+20) 的一个字为转移地址 JMP [BP+SI+20]; 数据存储单元 (SS:BP+SI+20) 的一个字为转移地址 JMP DS:[BP+SI+20]; 数据存储单元 (DS:BP+SI +20) 的一个字为转移地址 46
3. 段间直接寻址 ( 直接远转移 ) 指令的汇编形式 转移地址直接包含在转移指令中 转移地址通常采用符号地址形式, 也称远标号 转移地址左边加上类型说明 FAR PTR 指令的机器码形式 机器代码中的转移地址放在操作码之后, 包含偏移地址和段基值两个部分 转移地址在存储器中占两个字 : 低字单元存放偏移地址, 高字单元放段基值 47
示例 高地址 存储器 JMP FAR PTR PROG2 代码段 2 PROG2:MOV CX, DX 43006H MOV PROG2 下一指令 21004H 40H 21003H 00H 21002H 30H 21001H 06H 21000H JMP 当前指令 4000H 3006H 代码段 1 CS 低地址 IP 48
4. 段间间接寻址 ( 间接远转移 ) 指令的汇编形式 转移地址 ( 偏移地址部分 ) 在寄存器中, 采用寄存器寻址方式获得转移地址 转移地址通常采用符号地址形式, 也称远标号 转移地址左边加上类型说明 DWORD PTR 指令的机器码形式 转移地址保存在数据存储单元中 转移地址包含偏移地址和段基值两个部分 转移地址在存储器中占两个字 : 低字单元存放偏移地址, 高字单元放段基值 49
指令格式和寻址方式 指令格式示例 JMP DWORD PTR TAB JMP DWORD PTR DS:[20] JMP DWORD PTR [BX] JMP DWORD PTR [BX+TAB] JMP DWORD PTR [BX+20] JMP DWORD PTR [BX+SI] JMP DWORD PTR [BX+SI+TAB] JMP DWORD PTR [BX+SI+20] 寻址方式直接寻址直接寻址寄存器间接寻址寄存器相对寻址寄存器相对寻址基址变址寻址基址变址相对寻址基址变址相对寻址 50
示例 高地址 81023H 81022H 81021H 81020H 存储器 40H 00H 30H 06H 43006H MOV 下一指令 21000H JMP 当前指令 低地址 数据段 代码段 2 代码段 1 JMP DWORD PTR [BX] 3006H 4000H IP CS 1020H 8000H BX DS 51
小结 : 寻址方式的分类 数据寻址方式 1 立即寻址 2 寄存器寻址 3 直接寻址 4 寄存器间接寻址 5 寄存器相对寻址 6 基值变址寻址 7 相对基址变址寻址 8 比例变址寻址 转移地址寻址方式 1 段内直接转移 2 段内间接转移 3 段间直接转移 4 段间间接转移 52
作业 作业题 : 教材第 134 页第 1 2 题 53
下讲预告 下讲 主题 8086 指令系统 ( 一 ) 学习 资料 教材第 4 章 :4.2~4.4 54
谢谢! 55