2018 版 微机原理与系统设计 第 3 章 8086CPU 指令系统 董明皓, 博士 西安电子科技大学 dminghao@xidian.edu.cn
目录 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 2
目录 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 3
8086 指令分类 数据传送类 子程序调用与返回 算数运算类 中断调用返回 ( 软件 ) 逻辑运算类 字符串操作 移位类 输入输出 标志位操作类 其他 转移类 ( 条件 / 无条件转移 ) 宏指令 循环控制类 P29, 表 3.2( 缩写构成 )
1 2 3 4 5 汇编语言基本概念汇编语言指令分类 数据与转移地址的寻址方式 8086 的六类指令总结
基础知识导入 1 数据寄存器 通用寄存器 地址指针和变址寄存器 控制寄存器 段寄存器
基础知识导入 2 8086CPU 指令系统的寻址方式分为两类 : 1. 数据的寻址方式 : 寻找指令操作所需数据地址的方法 ; 2. 转移地址的寻址方式 : 寻找转移指令所需的程序地址的方法
基础知识导入 3 BX/BP 做基址 REG 提供 16 位的段内偏移地址, 有何区别? MOV BX, 0002H;0002H 转移到 BX 寄存器中 MOV BP, 0003H ;0003H 转移到 BP 寄存器中 MOV AL, 34H ;34H 转移到 AL 寄存器中 MOV [BX], AL ;AL 中数据转移到 (DS:BX) 为地址的 M 单元中 MOV [BP], AL ; AL 中数据转移到 (SS:BP) 为地址的 M 单元中 MOV DS:[BP], AL;AL 中数据转移到 (DS:BP) 为地址的 M 单元中 MOV SS:[BX], AL;AL 中数据转移到 (SS:BX) 为地址的 M 单元中
基础知识导入 4 常用寄存器默认地址搭配 CS:IP (CS 用户不能初始化 ) DS:BX DS:SI ES:DI SS:BP DS:/SS:- 段 ( 超越 ) 前缀 ;(DS:BP) 指 DS:BP 中内容
数据的寻址方式 计算机的指令包含助记符和操作数, 助记符指明指令的操 作性质, 操作数指明操作的对象 例 : MOV AX,BX 操作码操作数 (OPR) 数据的寻址 : 告诉 CPU 存 / 取数据的地方 寻址方式 : 求 OPR 所在地址的方式
数据的寻址方式 OPR 存在于 : 指令中直接给出的常数 ( 立即数 ) MEM 单元 REG; 数据的寻址方式 ( 共 8 种 ): 立即寻址 (Immediate Addressing ) 寄存器寻址 (Register Addressing ) 存储器寻址 (Memory Addressing )(5 种 ): 直接寻址 REG 间接寻址 REG 相对寻址基址变址寻址 基址变址且相对寻址 隐含寻址 (Hidden Addressing )
数据的寻址方式 立即寻址 (Immediate Addressing ) OPR 直接以数据形式 ( 立即数 ) 放在指令之后的寻址方式 例 : MOV AX,1200H AH AL MOV 00H 12H 代码段 例 : MOV 1200H,AX ; 立即数不能做 DST 语法 1: 立即数只能做 SRC; P36, Fig 3.31;
数据的寻址方式 寄存器寻址 (Register Addressing ) 指令的 OPR 在 REG 中的寻址方式 包括 :8 个通用 REG( 数据 - 专用 ; 地址 - 双用 )+4 个段 REG 如 :MOV AX,BX AX BX 例 : MOV AX,CL ;SRC/DST-REG 寻址 ;, 类型不一致 语法 2: 两 REG 可互传数据, 注意数据类型一致 ;
数据的寻址方式 寄存器寻址 (Register Addressing ) 例 :MOV [0200H],56H ;SRC- 立即数 ; ;[] 表示访问的是 MEM 的地址 (EA); DS:0200H? 类型? 类型? 类型? 类型 ; 错, 类型不明确, 编译不通过 ;MOV WORD PTR [0200H], 56H 语法 3: 类型要明确,SRC/DST 一方明确, 双方都明确 ;
数据的寻址方式 寄存器寻址 (Register Addressing ) 例 :MOV DS,1500H ; 立即数不能传输给段 REG(ES/SS/DS) ; 若要赋值, 采取以下方式 ;MOV AX,1500H ;MOV DS,AX ;Intel 规定, 段地址不能用一般的数据传输类指令改变 ; 例 :MOV DS,[1500H] ; 例 :MOV DS,[BX] ; 语法 4: 当 DS/SS/ES 为 DST 时,SRC 不能为立即数
数据的寻址方式 寄存器寻址 (Register Addressing ) 例 :MOV CS,AX ;,CS:IP 的初始值由程序启动后, 加载 OS 自动完成 ; 执行期间,CS:IP 的改变由 CPU 执行转移指令后改变, 而非 MOV 指令 ; ; 段内转移 (IP), 段间转移 (CS:SP) 语法 5:CS/IP 不能做 DST, 用户无权更改 CS IP 值
数据的寻址方式 通用语法规则 通用语法 1: 立即数只能做 SRC; 通用语法 2: 两 REG 可互传数据, 注意数据类型一致 ; 通用语法 3: 类型要明确,SRC/DST 一方明确, 双方都明确 ; 通用语法 4: 当 DS/SS/ES 为 DST 时,SRC 不能为立即数 通用语法 5:CS/IP 不能做 DST, 用户无权更改 CS IP 值
数据的寻址方式 存储器寻址 待寻找的 OPR 在 MEM 某单元中, 存储 OPR 的 EA( 有效地址 / 段内偏移地址 ) 由以下五种寻址方式的任何一种均可以找到 但在指令中给出的只是要寻找的操作数所在单元的段内偏移地址, 而操作数所在单元的段地址除非指令中用段前缀特别指明, 否则是默认的 DS
数据的寻址方式 直接寻址 [1508H],VAR,DAT 寄存器间接寻址 [BX/SI/DI] 寄存器相对寻址 [BX/BP/SI/DI]+8/16 位 disp 基址变址寻址 [BX/BP]+[SI/DI] 基址变址且相对寻址 [BX/BP]+[SI/DI]+8/16 位 disp 例 :MOV AX, [SI] [DI] ; : 变址 变址
数据的寻址方式 1- 存储器寻址 - 直接寻址 (Direct Addressing) 指令中直接给出了要寻找 OPR 所在单元的 16 位偏移地址 (EA), 操作数的段地址默认为数据段 例 : 若 DS 为 3000H, MOV AX, [1200H];SRC 为直接寻址 AX<--1122H [1200H] 的表达不常用,MEM 单元地址都符号化, 用变量表示 ;
数据的寻址方式 1- 存储器寻址 - 直接寻址 (Direct Addressing) 例 : 比较下列指令中源操作数的寻址方式 (VARW 是内存字变量 ): MOV AX, 1234H MOV MOV MOV AX, [1234H] AX, VARW AX, [VARW] 立即寻址 直接寻址 以下两者等效, 均为直接寻址
数据的寻址方式 1- 存储器寻址 - 直接寻址 (Direct Addressing) 例 : 指令 MOV AX,ES:[1200H], 若 ES= 1500H, 则向 AX 传送的数据来自存储器单元的地址是什么? 1500H:1200H = 1500H * 16 + 1200H = 15000H + 1200H = 16200H
数据的寻址方式 1- 存储器寻址 - 直接寻址 (Direct Addressing) 例 :MOV AX,[1200H] 需要人记忆数字地址, 复杂, 困难, 实际不常用 所以在实际的汇编语言程序设计中, 常采用给存放数据的单元, 定义一个符号地址名, 即变量名 / 变量 在程序设计中就可以用这个变量名代替原来的存储器单元的实际地址
数据的寻址方式 1- 存储器寻址 - 直接寻址 (Direct Addressing) DS + 1 5 0 0 0 H 0 0 0 4 H PA=1 5 0 0 4 H A H A L 15004H 15005H 例 4: 若 (DS)=1500H, TABLE 为在 DS 段定义的一个字变量, 且偏移地址为 0004H 则 CPU 执行 MOV AX, TABLE 指令完成的操作如下 : TABLE 数据段
数据的寻址方式 - 例题 1- 存储器寻址 - 直接寻址 (Direct Addressing) 直接寻址方式下,OPR 的 SEG 默认为 DS, 但允许段重设, 即段 ( 超越前缀 ) 例 :MOV AX,ES:[1200H]
数据的寻址方式 - 例题 1- 存储器寻址 - 直接寻址 (Direct Addressing) 例 : 若 DS 段定义如下变量 : DAT1 DB 12H DAT2 DB 34H 在 CS 段定义如下 : MOV AL, DAT1 MOV DAT2, DAT1 ; SRC- 直接,DST 寄存器 ;DAT1 单元内容 AL,(AL)=12H ; SRC/ DST - 直接, ;MEM 单元间不能互传数据数据 MOV AL,DAT1 MOV DAT2,AL 通用语法 6: 两 M 单元间不能直接操作 ( 逻辑运算 传输等都不可 )
数据的寻址方式 - 例题 1- 存储器寻址 - 直接寻址 (Direct Addressing) 例 : 若 DS 段定义如下变量 : DAT1 DB 12H DAT2 DB 34H 在 CS 段定义如下 : MOV DAT1, AX ; 类型不一致 ; 改 :MOV WORD PTR DAT1, AX ; 则,AL 原 DAT1,AH 原 DAT2; MOV WORD PTR DAT1,AX 执行后, 对应 M 单元内容单元如何变? 变量 DAT2 还存在吗? 通用语法 6: 两 M 单元间不能直接操作 ( 逻辑运算 传输等都不可 )
数据的寻址方式 - 例题 1- 存储器寻址 - 直接寻址 (Direct Addressing) 例 : 若 VAR1 为字变量, VAR2 和 VAR3 为字节变量, 判断下列指令的书写格式是否正确, 正确的说出 SRC 和 DST 的寻址方式, 不正确说出错误原因 MOV AX, VAR1 MOV AX, VAR2 MOV VAR2, VAR3 ; SRC- 直接寻址 ;DST 为 REG 寻址 ; 类型不一致 ; 改 :MOV AL, VAR2 ; 两存储器单元之间不能直接传送数据 MOV AL,VAR3 MOV VAR2,AL MOV [0200H],12H ; 类型不明确 ;MOV BYTE PTR [0200H],12H 或者 :MOV WORD PTR [0200H],12H
课后作业 以下文件另存为 jpeg 格式, 发送课代表, 命名方式 : 脑图 - 第 X 章 - 学号 - 姓名.jpg 1. 画出第一单元知识点脑图, 2. 画出第二单元知识点脑图 3. 画出第三单元第一节脑图 Deadline:2016.9.26 23:59
数据的寻址方式 直接寻址 [1508H],VAR,DAT 寄存器间接寻址 [BX/SI/DI] 注意 : 没有 BP 寄存器相对寻址 [BX/BP/SI/DI]+8/16 位 disp 基址变址寻址 [BX/BP]+[SI/DI] 基址变址且相对寻址 [BX/BP]+[SI/DI]+8/16 位 disp
数据的寻址方式 2- 存储器寻址 - 寄存器间接寻址 (Register Indirect Addressing) 这种寻址方式, 要寻找的操作数在某 M 单元中, 该存储器单元地址的段内 16 位 EA 在指令中以 BX SI DI 某一个 REG 给出 其段地址默认在 DS 段 EA= BX SI DI 默认在数据段 只能用这几个寄存器否则会无法通过编译
数据的寻址方式 - 例题 2- 存储器寻址 - 寄存器间接寻址 (Register Indirect Addressing) 例 1:MOV AX, [BX] 若 :DS=3000H, BX=1050H 说明 :SRC 和 DST 的寻址方式? SRC 所在单元的物理地址为? 指令完成的功能 SRC-REG 间接寻址 DST-REG 寻址 ; PA=(DS) 16+(BX) =30000H+1050H =31050H 指令完成的功能为 :(AX) (DS:(BX))
数据的寻址方式 - 例题 2- 存储器寻址 - 寄存器间接寻址 (Register Indirect Addressing) 例 :MOV ES:[SI], AL 执行后, 若 :ES=4000H, SI=1234H,(AL)=23H 则 :DST 所在单元的物理地址为? 指令执行后, 完成了什么操作? PA=(ES) 16+(SI) =40000H+1234H =41234H 指令完成的功能为 : (ES:(SI)) (AL) 指令执行后 (41234H)=23H.
数据的寻址方式 - 例题 2- 存储器寻址 - 寄存器间接寻址 (Register Indirect Addressing) 例 : 判断下列指令的书写格式是否正确, 正确的说出 SRC 和 DST 的寻址方式, 不正确说出错误原因, 并改正 MOV [BX], [SI] ; 两存储器单元之间不能直接操作改正 :MOV AL, [SI] MOV [BX], AL
数据的寻址方式 - 例题 2- 存储器寻址 - 寄存器间接寻址 (Register Indirect Addressing) MOV [DI],12H ; 类型不明确 ; ; 改正 :MOV WORD PTR [DI], 12H MOV [SI],CX ; ;DST 为寄存器间接寻址 ;SRC 为寄存器寻址 MOV [BX],56H ;, 类型不明确 ;SRC- 立即数 DST-REG 间接
数据的寻址方式 - 例题 2- 存储器寻址 - 寄存器间接寻址 (Register Indirect Addressing) 例 :DAT1 DB 12H DS:(BX) DAT2 DB 34H, 请将 DAT1 中的值写入 AL 12H 34H MOV BX, OFFSET DAT1 MOV AL, [BX] ; 变量定义单元 EA BX ;SRC- 立即数 ;DS:(BX) 作段内 EA; ;SRC-REG 间接寻址 ;BX/SI/DI 均可
数据的寻址方式 - 例题 2- 存储器寻址 - 寄存器间接寻址 (Register Indirect Addressing) 例 :DAT1 DB 12H DAT2 DB 34H MOV BX, OFFSET DAT1 MOV SI, OFFSET DAT2 MOV [BX],[SI], 该指令完成什么操作? 答 :,SRC/DST-REG 间接改 :MOV AL, [SI] MOV [BX], AL
数据的寻址方式 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 要寻找的 OPR 存储在某 M 单元中, 该 M 单元地址的段内 16 位 EA 在 BX BP SI DI 中 其段地址默认在 DS 段 BX EA= BP 8 位 DISP + SI 16 位 DISP DI MOV AX, [BX] + 05H 寄存器内的地址 + 相对位移量 DISP
数据的寻址方式 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing EA= BX BP SI DI + 8 位 DISP 16 位 DISP 在 DISP 为常数时,OPR 所在单元的段地址以寄存器为准 : 若寄存器为 BX SI DI, 操作数默认在 DS 段中 ; 若寄存器为 BP, 操作数默认在 SS 段中 在 DISP 为变量时, OPR 所在单元的段地址以变量为准, 变量在哪个段定义的, 就取该段的段地址
数据的寻址方式 - 例题 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 例 : 已定义变量 DAT1, 将 AL 写入目标单元. 解 1:MOV DAT1+3,AL 解 2:MOV BX, OFFSET DAT1 MOV [BX]+3,AL 以下写法都对 : [BX]+3=[BX+3]= 3+[BX] = 3[BX] DAT1 12H 34H 目标单元
数据的寻址方式 - 例题 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 例 : 下列程序完成什么功能? MOV BX, 0 MOV AL, 00H MOV DAT1[BX], AL ;BX 清 0 ;AL 清 0 ;AL 写入 DAT1+[BX] 单元 ;SRC:REG 相对寻址 ; ; 相对量为变量 ; ; 相对量的取值 =OFFSET 变量 ;EA= OFFSET DAT1 +(BX) ; 段地址以变量所在段为准
数据的寻址方式 - 例题 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 问 : 最后两条语句的 DST 寻址方式是什么? MOV BX, 0002H MOV BP, 0003H MOV AL, 34H MOV [BX], AL MOV [BP], AL MOV BX, 0002H MOV BP, 0003H MOV AL, 56H MOV DS:[BP], AL; 段 ( 超越 ) 前缀 MOV SS:[BX], AL
数据的寻址方式 - 例题 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 例 :MOV [BP], AL 的寻址方 ;(SS: (BP)+0) (AL) 式是什么? 完成功能是什么? ; 汇编后, 操作码中有 disp0 ;DST-REG 相对寻址, 而非 REG 间接寻址
数据的寻址方式 - 例题 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 例 1:MOV AX, [BP], 若 SS=1050H, DS=1060H, BP=0050H, 存放 SRC OPR 的存储单元的物理地址为 : PA=(SS) 16+(BP)+00H =10500H+0050H+00H =10550H 例 2: 若 (DS)=1500H, (BP)=0003H,TABLE 为在 DS 段定义的一个字变量, 且偏移地址为 0004H, 则 MOV AX,TABLE [BP] 指令完成的操作为? (AX) (DS: OFFSET TABLE+(BP)) 例 3: 若题目如上, 执行指令 MOV AX, TABLE[BP-2] 指令完成的操作为? (AX) (DS: OFFSET TABLE+(BP)-2)
数据的寻址方式 - 例题 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 例 :CPU 执行 :PUSH AX, PUSH BX PUSH CX 如何将压入 (AX) (DX), 但是不破坏 SP 指针? 利用 BP 相对寻址默认在 SS 段 MOV BP, SP ; 若不能破坏 BP, 则 PUSH BP MOV DX, [BP]+4 在堆栈中取 / 放数据, 而不破坏 SP 指针 个性语法 :Stack 按字操作
数据的寻址方式 4- 存储器寻址 - 基址变址寻址 Based Indexed Addressing 要寻找的 OPR 在某 M 单元之中, 该单元 BX SI EA 的一部分在中, 另一部分在中 BP DI EA= BX + BP SI DI 例 :MOV AX, [BX][SI] MOV AX, [BP][SI] 该单元的段地址以基址 REG 为准 : 若基址寄存器为 BX, 则段地址默认在 DS 中, 若基址寄存器为 BP, 则段地址默认在 SS 中
数据的寻址方式 - 例题 4- 存储器寻址 - 基址变址寻址 Based Indexed Addressing 例 :DAT1 DB 12H DAT2 DB 34H, 将 DAT1 中的值写入 AL DAT1 DAT2 12H 34H MOV BX, OFFSET DAT1 MOV AL, [BX] 要求用基址变址寻址完成 MOV BX,OFFSET DAT1 MOV SI,0 MOV AL,[BX][SI] ; 变量定义单元 EA BX ;DST- REG 间接寻址 ;DST-REG 间接寻址
数据的寻址方式 - 例题 4- 存储器寻址 - 基址变址寻址 Based Indexed Addressing 例 1:MOV AX, [BX][SI] (AX) (DS:(BX+SI)) 假设 :BX=0000H, SI=0005H BP=0003H, DI=0005H 例 2:MOV AX, [BP][SI] (AX) (SS:(BP+SI)) 例 3:MOV [BP][DI], AL (SS:(BP+DI)) (AL) DS:0003H DS:0004H DS:0005H DS:0006H DS:0007H DS:0008H DS:0009H DS:000AH 01H 23H 76H 0AAH 55H A B C SS:0003H SS:0004H SS:0005H SS:0006H SS:0007H SS:0008H SS:0009H SS:000AH 11H 31H 65H 0FFH 00H 77H 81H 97H
数据的寻址方式 5- 存储器寻址 - 基址变址且相对寻址 Based Indexed Relative Addressing 基址变址寻址的扩充, 操作数仍在 M 中,M 单元的 EA 为 : BX 8 位 DISP EA= + SI + BP DI 16 位 DISP MOV AX, [BX][DI]04 MOV DS:[BP][DI]+04H, AL 在 DISP 为常数时 : 如果用 BX 作为基地址, 操作数默认在 DS 段中 ; 如果用 BP 作为基地址, 则在 SS 段中 在 DISP 为变量 : OPR 所在单元的段地址以变量所在段为准
数据的寻址方式 - 例题 5- 存储器寻址 - 基址变址且相对寻址 Based Indexed Relative Addressing 例 1: MOV AX, [BX][DI]04 (AX) (DS:(BX+DI+04H)) 假设 :BX=0000H, SI=0005H BP=0003H, DI=0002H 例 2:MOV AX, [BP][DI]04 (AX) (SS:(BX+DI+04H)) 例 3:MOV DS:[BP][DI]+04H, AL (DS:(BX+DI+04H)) (AL) DS:0003H DS:0004H DS:0005H DS:0006H DS:0007H DS:0008H DS:0009H 01H 23H 76H 0AAH 55H A B SS:0003H SS:0004H SS:0005H SS:0006H SS:0007H SS:0008H SS:0009H 11H 31H 65H 0FFH 00H 77H 81H DS:000AH C SS:000AH 97H
数据的寻址方式 直接寻址 [1508H],VAR,DAT 寄存器间接寻址 [BX/SI/DI] BX/SI/DI 寄存器相对寻址 [BX/BP/SI/DI]+8/16 位 disp disp 定 基址变址寻址 [BX/BP]+[SI/DI] BX/BP 基址变址且相对寻址 [BX/BP]+[SI/DI]+8/16 位 disp disp 定 段地址确认, 优先权 : 变量 >REG
数据的寻址方式 - 例题 例 : 判断下列指令的书写格式是否正确, 正确的说出 SRC 和 DST 的寻址方式, 不正确说出错误原因 MOV AX, [BX][SI] MOV AX, BL MOV [BP], [DI+01H] MOV [BX][DI]+02H,12H DAT1 DB 12H MOV AL, DAT1 MOV AL, DAT1+DAT2 MOV AL, DAT1+2 ;, SRC 为基址变址寻址 ;DST 为寄存器寻址 ; 类型不一致 ; 两存储器单元之间 ; 不能直接传送数据 ; 类型不明确 ;, 字节变量对应 DB 单元数据 AL ; 直接寻址 ;,OPR 不允许变量运算 ; 通用语法 7: 指令语句中, 不允许变量运算
数据的寻址方式 隐含寻址 Hidden Addressing 有些指令的指令码中不包含指明操作数地址的部分, 而其操作码本身隐含的指明了操作数地址 如 : 乘除法指令 字符串操作类指令等 例 :MOVSB; 字节操作 ; 从 (DS:SI) 存储单元取一个字节, 传送到 (ES:DI) : 单元,(ES:DI) (DS:SI) ;SI 内容自动 +1/-1(DF=0/1 时 ), 即 (SI) (SI)±1 ; DI 同上,(DI) (DI)±1 P67,3.13 所有的字符串操作指令的 DST/SRC 均为隐含寻址
数据的寻址方式 - 例题 隐含寻址 Hidden Addressing 例 :PUSH AX 解 : 只给出单 OPR, 该操作数为 SRC, 采用 REG 寻址 (SP)-2 (SP), 改变栈顶 ; (AX) (SS: (SP)) DST 为隐含寻址 P67,3.13 所有的字符串操作指令的 DST/SRC 均为隐含寻址
基础知识导入 1 8086CPU 指令系统的寻址方式分为两类 : 1. 数据的寻址方式 : 寻找指令操作所需数据地址的方法 ; 2. 转移地址的寻址方式 : 寻找转移指令所需的程序地址的方法 注 寻址本质是 找门牌号
基础知识导入 2 8086 指令系统中的转移指令有两大类 : 无条件转移指令 : 有 JMP CALL RET IRET( 可以段内 / 间 ) 条件转移指令 : 如 JZ JC JCXZ LOOP 等 ( 只能在段内, 且为 short 型 ) 先介绍无条件转移指令 JMP :JMP OPR 程序转移到由 OPR 指定的位置执行
基础知识导入 3 CS :IP 当前执行指令 JMP L1 下一条指令 MOV AX, BX PUSH AX PUSH BX CS :IP 转移指令的地址 跳转后指令 L1: P355, 查看各个指令长度
基础知识导入 3 每一条指令语句存储在 M 中代码段的某一空间中 ; 程序的执行顺序由 CS:IP 决定,IP 内容指向下一条指令的地址 ; 具体地址需要寻址获得 可以通过改变 CS:IP 的内容实现程序指令的跳转, 寻找下一条执行指令地址的过程叫, 即 : 转移地址的寻址 (CS:IP)
转移地址的寻址方式 寻找的转移后指令的地址, 赋给 IP 或 CS:IP, 从而实现程序的转移 如果程序转移后只有 IP 发生了改变, 则称为段内转移或者称为近程转移 /NEAR 型转移 如果程序转移后 CS IP 均发生了改变, 则称为段间转移或者称为远程转移 / 也称为 FAR 型转移
转移地址的寻址方式 转移地址的寻址方式有下列 4 种 : 转移地址寻址方式 段内 段间 直接方式 间接方式 直接方式 间接方式 段内寻址表示 : 转移在同一 CS 段内完成 段间寻址表示 : 转移在不同 CS 段之间完成
转移地址的寻址方式 8086 指令系统中的转移指令有两大类 : 无条件转移指令 : 有 JMP CALL RET IRET( 可以段内 / 间 ) 条件转移指令 : 如 JZ JC JCXZ LOOP 等 ( 只能在段内, 且为 short 型 ) 先介绍无条件转移指令 JMP :JMP OPR 程序转移到由 OPR 指定的位置执行 所有条件转移指令的寻址方式都是段内直接 / 相对寻址 P56-57
1. 段内直接寻址 (Direct addressing within same segment) ( 也叫段内相对寻址 ) 指直接在指令中给出转移目的地址 (16 位偏移地址 ), 转 移在同一个段内完成 段内转移地址的寻址方式 段内转移地址的寻址方式 ( 只有 IP 发生改变 ) - 适合于条件 / 无条件转移指令 如 :JMP LABEL ; 程序转移到标号 LABEL 处执行
段内转移地址的寻址方式 1. 段内直接寻址 汇编到该语句时, 汇编程序自动计算 : 当前 IP 及到目的地程序所在到当前 IP 间隔的位移量 Disp(16 位 ) 向地址增加的方向转移, 为正转移,DISP 用原码表示 ; 向地址减小的方向转移, 为负转移,DISP 用补码表示 ; 转移目的地物理地址的求法 : PA=(CS) 16+( 当前 IP)+DISP 注 :8086 指令系统当中的所有条件转移指令只能在段内转移, 且转移范围以当前 IP 为基准, 不能超出 -128 +127 之间, 其寻址方式为段内相对寻址
转移地址的寻址方式 16 位 DISP XXH 操作码??H -32768??H JMP L1 :3 字节 JMP NEAR PTR [] ;3 字节 JMP SHORT L1 ;2 字节 当前 IP L1: 间隔的字节数称为相对位移量 DISP +32767 转移目的地的 IP= 当前 (IP)+16 位 DISP
转移地址的寻址方式 例 :8086CPU 执行 JZ L1 时,IP=0100H,disp = FDH, 执行 该指令后,(IP)=? 解 : 当前 IP:0102H DISP:FDH = 1111 1101B 计算机的带符号数用补码表示 [X] 补 = 1111 1101B X=[[X] 补 ] 补 =1000 0011 B = -3 CS:00FFH JZ L1 操作码 CS:0100H 8 位 Disp CS:0101H P354-355 查转移指令的指令长度 当前 IP 下一指令 CS:0102H
转移地址的寻址方式 2. 段内间接寻址 (Indirect addressing within same segment) 指转移目的 IP(16 位偏移地址 ) 保存在 REG 或 M 单元, 转移也在同一个段内完成 JMP BX ; 程序转移的目的地址为 BX 的内容 JMP VAR1 ; 程序转移的目的地址为字型变量 VAR1 的内容 JMP VAR1[SI] ; 目的地址保存在存储器, 其有效地址为 (SI)+OFFSET VAR1 注 : 在指令中指出保存转移地址所使用的 REG 或 MEM 的 EA
2. 段内间接寻址 (Indirect addressing within same segment) 转移地址的段内偏移地址存放在 : 一个 16 位的 REG 中或 MEM 的一个字单元之中 ; 其地址由前面讲过的数据的寻址方式指明 寻址所得到的不是数据, 而是偏移地址
转移地址的寻址方式 例 : 若 (DS)=2000H,(BX)=0100H,(SI)=0002H, (20100H)=1200H,(20102H)=1250H, 则 CPU 执行 : JMP BX 指令后,(IP)=? 0100H JMP WORD PTR [BX] 指令后,(IP)=? 1200H JMP WORD PTR [BX][SI] 指令后,(IP)=? 1250H
转移地址的寻址方式 例 : 用段内间接寻址实现向指令 L2 的跳转 解 1:MOV BX, OFFSET L2 JMP BX ; ; 段内间接寻址 ;BX 内容不作为数据而作为转移地址, 给 IP 解 2: DS 段 :TABLE DW L2; CS 段 : JMP TABLE L2: ; 定义字单元变量 ;OFFSET L2 ; 找到 TABLE 单元 ( 变量, 字单元 ); ;TABLE 单元取字数据, 不做数据用, 做转移目的地地址用 ; ; 给 IP ;JMP Table- 段内间接寻址 ;
转移地址的寻址方式 段间转移地址的寻址方式 (CS IP 均发生改变 ) - 只适合于无条件转移指令 XXH 操作码 SEG LABEL **H **H OFFSET LABEL????:****H LABEL:??H??H JMP FAR PTR LABEL ; 代码段 1 代码段 2
转移地址的寻址方式 如 :JMP FAR PTR ADDR + CS 4 0 0 0 H IP 3 0 0 0 H 操作码 OFFSET 低字节 OFFSET 高字节 SEG 低字节 SEG 高字节 00 30 00 40 IP CS 4 3 0 0 0 H ADDR OP CODE 存储器
转移地址的寻址方式 存放转移地址的首址 低字节 高字节 低字节 高字节 转移 OFFSET IP 转移 SEG 地址 CS 存储器
转移地址的寻址方式 1. 段间直接寻址 (Direct addressing between different segments ) 段间直接寻址是指直接在指令中给出转移目的地址 (16 位偏移地址和 16 位段地址 ), 转移在不同段之间完成 指令中用 JMP < 标号 > 表示, 当然这里的标号与该指令处在不同的段 JMP LABEL ; 程序转移到标号 LABEL 处执行 (LABEL 不在本段中 ) JMP FAR PTR 标号名 ; 指令语句书写时直接写出转移 ; 目的地的符号地址 (FAR 型标号 ; 名 )
转移地址的寻址方式 1. 段间间接寻址 (Indirect addressing between different segments ) 转移在不同代码段之间完成, 转移目的地址 (32 位地址 ) 保存在存储单元中 存储单元必须是双字型变量 : 第一个字用于存放目的地址的段内偏移地址第二个字用于存放目的地址的段地址 JMP VAR3 ; 程序转移的目的地址为双字型变量 VAR3 的内容 JMP VAR1[SI] ; 目的地址保存在存储器, 其有效地址为 (SI)+OFFSET VAR3 在指令中指出存储单元的偏移地址, 可以采用以上介绍的 5 种存储器寻址方式
转移地址的寻址方式 若 (DS)=3000H, (BX)=1000H, (DI)=2000H, 则执行 JMP DWORD PTR [BX][DI] 后, 目的地的物理地址 DS: 3 0 0 0 BX: 1 0 0 0 DI: + 2 0 0 0 3 3 0 0 0 H CS: 8 0 0 0 16 IP: + 2 0 0 0 8 2 0 0 0 H 33000H 82000H 05H 00H 20H 00H 80H 目的地址 IP CS
综上所述, 转移地址的 4 种寻址方式也可以从指令形式 / 数据 来源加以区分, 即 : 转移地址的寻址方式 转移地址 寻址方式 JMP JMP JMP LABEL REG16 MEM 段内直接寻址 ( LABEL在本段内 ) 段间直接寻址 ( LABEL不在本段 ) 段内间接寻址 段内间接寻址 ( MEM为字型 ) 段间间接寻址 ( MEM为双字型 )
总结 - 数据的寻址方式 (8 种 ) 立即寻址 (Immediate Addressing ) MOV AL, 20H 寄存器寻址 (Register Addressing ) MOV BX, AX 存储器寻址 (Memory Addressing )(5 种 ): 直接寻址 MOV AL, [1200H] 寄存器间接寻址 MOV AL, [BX] 寄存器相对寻址 MOV AL, [BX]+03H 基址变址寻址 MOV AL, [BX][SI] 基址变址且相对寻址 MOV AL, [BX][SI]04H 隐含寻址 (Hidden Addressing ) STI 或 CLI
总结 - 指令的寻址方式 (4 种 ) 转移地址寻址方式 段内 段间 直接方式 间接方式 直接方式 间接方式 段内直接寻址 JMP LABEL (LABLE 在本段 ) 段内间接寻址 JMP BX JMP VAR1 JMP VAR1[SI] 段间直接寻址 JMP LABEL (LABLE 不在本段 ) 段间间接寻址 JMP VAR3; VAR3 位双字变量 JMP VAR1[SI] ; 目的地址保存在存储器, 其有效地址为 (SI)+OFFSET VAR3
课后作业 第三章第一节 第二节思维导图交课代表 3.4(1)~(10) 3.5(1)~(3) 3.6 3.7 3.9 ( 自己预习 ADD 指令 ) Deadline:2018.9.28 23:59
弹性内容
数据的寻址方式 - 例题 3- 存储器寻址 - 寄存器相对寻址 Register Relative Addressing 例 : 假设指令 :MOV BX, [SI+100H], 在执行它时, (DS)=1000H,(SI)=2345H, 内存单元 12445H 的内容为 2715H, 问该指令执行后,BX 的值是什么? 源操作数的有效地址 EA 为 : EA=(SI)+100H=2345H+100H=2445H 该操作数的物理地址应由 DS 和 EA 的值形成, 即 : PA=(DS)*16+EA=1000H*16+2445H=12445H 把从物理地址为 12445H 开始的一个字的值传送给 BX
转移地址的寻址方式 例 : DS 段 :TABLE DW L2; CS 段 : MOV BX, OFFSET TABLE JMP WORD PTR [BX] L2: ; ; ; ; 以 BX REG 做间接寻址方式的段内间接寻址 例 : DS 段 :TABLE DW L2; CS 段 : MOV SI, 0 MOV BX, OFFSET TABLE JMP WORD PTR [BX] [SI] L2: ; ; ; ; 以 BX REG+SI 源变址 REG 做基址变址方式的段内间接寻址
为什么立即数不能直接赋值给寄存器?( 解释 1) 立即数直接写入段寄存器这样的指令, 被翻译成机器码之后将占用更多的字节, 在事先规定的指令长度范围内无法存贮下这么多的内容, 因此改由先写入通用寄存器, 再由通用寄存器写入段寄存器的办法代替 机器指令有它的编码规则, 以若干位代表不同的操作码, 若干位代表寻址方式组合, 若干位表示操作数类型是字还是字节, 若干位表示各个操作数 一般说来,CPU 里面只有少数几个寄存器, 只需要不多的几位即可区分不同的寄存器 比如区分 8 个寄存器只需要 3 bit 进行编码, 因此, 用寄存器寻址的机器指令, 长度较短 而内存或立即寻址, 需要给出 8 位或 16 位的操作数, 或内存地址, 它们需要的位数显然比寄存器要多, 因而机器指令也就会变长 如 :sub ax, bx 指令两个操作数都是寄存器, 所以操作码 + 寻址方式组合 + 数据类型 + 两操作数的寄存器代码这些组合后只有两个字节 : 2B C0 mov ax, 0 这条指令中,16 位的源操作数 -- 立即数 0 就要单独占用两个字节, 其它操作码和目的操作数等的编码再占用一个字节, 指令长度就成了三个字节 : B8 00 00 ( 后面的两个 00 00 就是源操作数 0)
为什么立即数不能直接赋值给寄存器?( 解释 2) 数据总线和数据 REG 直接连接, 但是和段 REG 不直接连接, 所以写数据必须通过通用 REG
数据的寻址方式 例 :DAT1 DB 12H DAT2 DB 34H, 将 DAT1 及以下 10 个单元清零 实现 1:MOV CX, 10 MOV BX, OFFSET MOV SI, 0 MOV AL,0 NEXT:MOV [BX][SI],AL INC SI LOOP NEXT 实现 1:MOV CX, 10 MOV BX, 0 MOV SI, 0 MOV AL,0 NEXT:MOV DAT1 [BX][SI],AL INC SI LOOP NEXT