本教案内容 第 3 章 8086CPU 指令系统 1. 汇编语言指令 9. 转移指令 10. 2. 8086 指令分类循环控制指令 11. 子程序调用返回 3. 数据与转移地址的指令寻址方式 12. 中断调用返回指 4. 数据传送类指令令 5. 算术运算类指令 13. 字符串操作指令 6. 逻辑运算类指令 14. I/O 输入输出指令 7. 移位类指令 15. 其它指令 8. 标志位操作指令 16. 宏指令
3.33 数据与转移地址的寻址方式 在指令中, 用于说明操作数所在地址的方法就称为寻址方式 8086CPU 指令系统的寻址方式分为两类 : 1. 数据的寻址方式 : 寻找指令操作所需数据的方法 ; 2. 转移地址的寻址方式 : 寻找转移指令所需的程序地址
下面讲关于数据的寻址方式时, 均以数 据传送指令 MOV 为例讲解 MOV 指令格式如下 : MOV DST, SRC 助记符 目的操作数 指令完成的功能 : (DST) 源操作数 (SRC)
数据的寻址方式就是告诉 CPU 存 / 取数据的地方 数据的寻址方式 ( 共 8 种 ): 立即寻址 (Immediate Addressing ) 寄存器寻址 (Register Addressing ) 存储器寻址 (Memory Addressing )(5 种 ): 直接寻址 寄存器间接寻址 寄存器相对寻址 寄存器相对寻址基址变址寻址和基址变址且相对寻址 隐含寻址 (Hidden Addressing )
1. 立即寻址 3.33 数据寻址方式 操作数直接存放在指令中, 紧跟在操作码之后, 作为指令的一部分, 存放在代码段里, 这种操作数称为立即数 立即寻址主要用来给 REG 或 M 赋初值 注意 : 只能用于源操作数字段, 不能用于目的操作数字段 如 :MOV 12H, AL ( 语法错误 )
例 :MOV AX,1234H A X A H A L B8H 34H 12H CS 段 操作码 (AX)=1234H 存储器
2. 寄存器寻址 数据放在指令规定的寄存器中, 对 16 位数据, REG 可以是 AX BX CX DX SI DI SP BP 以及段寄存器, 而对于 8 位数据, REG 可以是 AH AL BH BL CH CL DH DL 在程序设计中, 一般存放数据时, 寄存器选择通用寄存器, 而存放结果时尽可能的使用 AX 累加器, 因为使用 AX 累加器要比用其它寄存器存放结果, 指令执行时间要短一些 寄存器寻址既可以作 DST, 也可以作 SRC
例 :MOV AX, BX A X B X 若 (AX)=1234H,(BX)=5678H, 则 CPU 执行上条指令后,(AX)=5678H, 而 (BX) 不变 又如 :MOV CX, DL ( 语法错误 ) 错误原因 : 类型不一致
3. 存储器寻址 3.33 数据寻址方式 这类寻址方式, 操作数在存储器中, 而存储器单元的地址由以下五种寻址方式的任何一种均可以找到 但在指令中给出的只是要寻找的操作数所在单元的段内偏移地址, 而操作数所在单元的段地址除非指令中用段前缀特别指明, 否则是默认的 DS
1 直接寻址 (Direct Addressing ) 指令中直接给出了要寻找操作数所在单元的 16 位偏移地址 指令中直接给出的操作数所在单元的 16 位偏移地址默认在数据段 也可以通过增加段前缀来改变操作数所在的段地址 操作数所在单元的物理地址 : PA= ( 段寄存器 ) 16 + 指令中给出的偏移地址
例 1:MOV AX,[2000H] 若 DS 为 3000H, 则 : DS + 3 0 0 0 0 H 2 0 0 0 H PA=3 2 0 0 0 H A X A H A L 32000H 32001H A1H 00H 20H 存储器 CS 段 操作码 数据段
例 2:MOV [2000H],AL 若 DS 为 3000H, 则 : DS + 3 0 0 0 0 H 2 0 0 0 H PA=3 2 0 0 0 H A L 32000H 00H 20H CS 段 操作码 数据段 存储器
例 3:MOV ES:[2000H],AL 若 ES 为 2050H, 则 : ES + 2 0 5 0 0 H 2 0 0 0 H PA=2 2 5 0 0 H A L 22500H 00H 20H 前缀码操作码 CS 段附加数据段 存储器
在实际的汇编语言程序设计中, 如果程序比较复杂, 而用到的存放数据的单元又很多, 那么在直接寻址方式当中, 用户就要记住存放数据的每个单元的地址, 同时还要记住该地址单元存放的数据的意义, 这样对设计程序带来了很大的困难 所以在实际的汇编语言程序设计中, 常常采用给存放数据的单元, 定义一个符号地址名, 即变量名 / 变量
变量名一但定义了, 就具有了 : 该单元的段地址 该单元的偏移地址 类型 长度 五个属性 大小 这样, 在程序设计中就可以用这个变量名代替原来的存储器单元的实际地址
例 4: 若 (DS)=1500H,TABLE 为在 DS 段定义的一个字变量, 且偏移地址为 0004H 则 CPU 执行 MOV AX,TABLE 指令完成的操作如下 : 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 存储器 TABLE 数据段
例 5: 若 VAR1 为字变量, VAR2 和 VAR3 为字节变量, 判断下列指令的书写格式是否正确, 正确的说出 SRC 和 DST 的寻址方式, 不正确说出错误原因 MOV AX, VAR1 SRC 为直接寻址 DST 为寄存器寻址 MOV AX, VAR2 类型不一致 MOV VAR2, VAR3 两存储器单元之间不能直接传送数据 MOV [0200H],12H 类型不明确
例 6: 将例 5 中语法不正确的语句改对 MOV AX, VAR2 类型不一致改 :MOV AL, VAR2 MOV VAR2, VAR3 两存储器单元之间不能改 :MOV AL,VAR3 直接传送数据 MOV VAR2,AL MOV [0200H],12H 类型不明确改 :MOV BYTE PTR [0200H],12H 或者 :MOV WORD PTR [0200H],12H 注 :PTR 为临时属性修改符
2 寄存器间接寻址 Register Indirect Addressing 这种寻址方式, 要寻找的操作数在某存储器单元中, 该存储器单元地址的段内 16 位偏移地址在指令中以 BX SI DI 某一个寄存器给出 其段地址默认在 DS 段 EA= BX SI DI
例 1:MOV AX, [BX] 其 SRC 为寄存器间接寻址 ; DST 为寄存器寻址 ; 指令完成的功能为 : AX (DS:(BX)) 若 :DS=3000H, BX=1050H 则 :SRC 所在单元的物理地址为 : PA=(DS) 16+(BX) =30000H+1050H =31050H
DS: 3 0 0 0 0 H + BX: 1 0 5 0 H PA: 3 1 0 5 0 H 8BH 07H CS 段 操作码 A H A X A L 31050H 31051H 数据段 存储器
例 2:MOV ES:[SI], AL 指令完成的功能为 : (ES:(SI)) (AL) 若 :ES=4000H, SI=1234H,(AL)=23H 则 :DST 所在单元的物理地址为 : PA=(ES) 16+(SI) =40000H+1234H =41234H 指令执行后 (41234H)=23H.
例 3: 判断下列指令的书写格式是否正确, 正确的说出 SRC 和 DST 的寻址方式, 不正确说出错误原因, 并改正 1 MOV [BX], [SI] 两存储器单元之间不 改正 :MOV AL, [SI] MOV [BX], AL 能直接传送数据 ; 类型也不明确
2 MOV [DI],12H 类型不明确 改正 :MOV WORD PTR [DI], 12H 3 MOV [SI],CX DST 为寄存器间接寻址 DST 为寄存器间接寻址 SRC 为寄存器寻址
3 寄存器相对寻址 Register Relative Addressing 要寻找的操作数在某存储器单元之中, 该单元 的有效地址的一部分在 8 位个 DISP 16 位 BX BP SI DI 中, 另一部分为一 其中,DISP 相对位移量
EA= BX BP SI DI + 8 位 DISP 16 位 DISP 在 DISP 为常数时, 操作数所在单元的段地址以寄存器为准, 若寄存器为 BX SI DI, 操作数默认在 DS 段中 若寄存器为 BP, 操作数默认在 SS 段中 在 DISP 为变量时, 操作数所在单元的段地址以变量为准, 变量在哪个段定义的, 就取该段的段地址
例 1:MOV AX, [BX]+05H 其中,SRC 也可以写成 : [BX+05H] 05H[BX] 05H+[BX] 若 :DS=2000H, BX=0008H, 存放操作数单元的物理地址为 : PA=(DS) 16+(BX)+05H =20000H+0008H+05H =2000DH
+ 2 0 0 0 0 H 0 0 0 8 H 0 0 0 5 H 2 0 0 0 D H 8BH 47H 05H 操作码 CS 段 AX A H A L 2000DH 2000EH 数据段 存储器
例 2:MOV AX, [BP] 若 :SS=1050H, BP=0050H, 存放操作数的存储单元的物理地址为 : PA=(SS) 16+(BP)+00H ( ) =10500H+0050H+00H =10550H
+ 1 0 5 0 0 H 0 0 5 0 H 1 0 5 5 0 H 操作码 相对偏移量 DISP 为 0, 这里特别指出,BP 寄存器无间接寻址, 只不过再相对寻址时,DISP 为 0 A H A L 10550H 10551H SS 段 CS 段 存储器
例 3: 若 (DS)=1500H,TABLE 为在 DS 段定义的一个字变量, 且偏移地址为 0004H,(BX)=0003H MOV AX,TABLE [BX] SRC 的寻址方式为寄存器相对寻址 指令完成的操作为 : (AX) (DS: OFFSET TABLE+(BX))
4 基址变址寻址 Based Indexed Addressing 要寻找的操作数在某存储器单元之中, 该单元 BX 有效地址的一部分在中, 另一部分在 BP 中 BX EA= + BP SI DI SI DI 该单元的段地址以基址寄存器为准, 若基址寄存器为 BX, 则段地址默认在 DS 中, 若基址寄存器为 BP, 则段地址默认在 SS 中
例 1:MOV AX, [BX][SI] (AX) (DS:(BX+SI)) 例 2:MOV AX, [BP][SI] (AX) (SS:(BP+SI)) 例 3:MOV [BP][DI], AL (SS:(BX+DI)) (AL)
3.3 数据寻址方式 5 基址变址且相对寻址 Based Indexed Relative Addressing 它是基址变址寻址的扩充, 操作数仍在存储器中, 存储器单元的有效地址为 : BX SI 8 位 DISP EA= + + BP DI 16 位 DISP 同样, 如果用 BX 作为基地址, 操作数默认在 DS 段中 ; 如果用 BP 作为基地址, 则在 SS 段中 在 DISP 为变量时, 操作数所在单元的段地址以变量为准, 变量在哪个段定义的, 就取该段的段地址
例 1: MOV AX, [BX][DI]04 (AX) (DS:(BX+DI+04H)) 例 2:MOV AX, [BP][DI]04 (AX) (SS:(BP+DI+04H)) 例 3:MOV DS:[BX][DI]+04H, AL (DS:(BX+DI+04H))( (AL)
8. 隐含寻址 Hidden Addressing 有些指令的指令码中不包含指明操作数地址的部分, 而其操作码本身隐含的指明了操作数地址 如 : 乘除法指令 字符串操作类指令等 MOVSB; 字节操作 MOVSB; 字节操作 (ES:DI) (DS:SI),(SI) (SI±1),(DI) (DI±1)
例 1. 若 (BX)=0158H, (DI)=10A5H, (DS)=2100H, DISP=1B57H, (BP)=0100H, (SS)=1100H, 段寄存器按默认段寄存器, 则相对于各种寻址方式的 EA 的求法如下 : 直接寻址 : EA=1B57H PA=21000H+1B57H=22B57H
例 1. 若 (BX)=0158H, (DI)=10A5H, (DS)=2100H, DISP=1B57H, (BP)=0100H, (SS)=1100H, 段寄存器按默认段寄存器, 则相对于各种寻址方式的 EA 的求法如下 : 寄存器间接寻址 ( 设寄存器为 BX): EA=0158H PA=21000H+0158H=21158H
例 1. 若 (BX)=0158H, (DI)=10A5H, (DS)=2100H, DISP=1B57H, (BP)=0100H, (SS)=1100H, 段寄存器按默认段寄存器, 则相对于各种寻址方式的 EA 的求法如下 : 寄存器相对寻址 ( 以 BP 为例 ): EA=0100H+1B57H=1C57H PA=11000H+1C57H =12C57H
例 1. 若 (BX)=0158H, (DI)=10A5H, (DS)=2100H, DISP=1B57H, (BP)=0100H, (SS)=1100H, 段寄存器按默认段寄存器, 则相对于各种寻址方式的 EA 的求法如下 : 基址变址寻址 (BX DI): EA=0158H+10A5H=11FDH PA=21000H+11FDH=221FDH
例 1. 若 (BX)=0158H, (DI)=10A5H, (DS)=2100H, DISP=1B57H, (BP)=0100H, (SS)=1100H, 段寄存器按默认段寄存器, 则相对于各种寻址方式的 EA 的求法如下 : 基址变址相对寻址 (BP DI): EA=0100H+10A5H+1B57H=2CFCH PA=11000H+2CFCH=13CFCH
例 2: 判断下列指令的书写格式是否正确, 正确的说出 SRC 和 DST 的寻址方式, 不正确说出错误原因 MOV AX, [BX][SI] SRC 为基址变址寻址 DST 为寄存器寻址 MOV AX, BL 类型不一致 MOV [BP], [DI+01H] 两存储器单元之间不能直接传送数据 MOV [BX][DI]+02H,12H 类型不明确
3.3 转移地址的寻址方式 寻找的操作数指定的地址, 赋给 IP 或 CS:IP, 从而实现程序的转移 如果程序转移后只有 IP 发生了改变, 则称为段内转移或者称为近程转移 ( 也称为 NEAR 型转移 ) 如果程序转移后 CS IP 均发生了改变, 则称为段间转移或者称为远程转移 ( 也称为 FAR 型转移 )
3.3 转移地址的寻址方式 8086 指令系统中的转移指令有两大类 : 无条件转移指令 : 有 JMP CALL RET IRET 条件转移指令 : 如 JZ JC JCXZ LOOP 等 先介绍无条件转移指令 JMP : JMP OPR 程序转移到由 OPR 指定的位置执行
3.3 转移地址的寻址方式 转移地址的寻址方式有下列 4 种 : 转移地址 寻址方式 直接方式 段内 间接方式 直接方式段间 间接方式 段内寻址表示转移在本段内完成, 段间寻址表示转移在不同段之间完成
3.3 转移地址的寻址方式 段内转移地址的寻址方式 ( 只有 IP 发生改变 ) 1. 段内直接寻址 (Direct addressing within same segment) ( 也叫段内相对寻址 ) 段内直接寻址是指直接在指令中给出转移目的地址 (16 位偏移地址 ), 转移在同一个段内完成 指令中用 JMP < 标号 > 表示, 当然这里的标号与该指令处在同一个段个段 例如 : JMP LABEL ; 程序转移到标号 LABEL 处执行
3.3 转移地址的寻址方式 16 位 DISP XXH -32768??H??H JMP L1 ;JMP NEAR PTR L1 操作码 当前 IP +32767 L1: 间隔的字节数称为相对位移量 DISP 转移目的地的 IP= 当前 (IP)+16 位 DISP
3.3 转移地址的寻址方式 2. 段内间接寻址 (Indirect addressing within same segment) 段内间接寻址是指转移目的地址 (16 位偏移地址 ) 保存在寄存器或存储单元, 转移也在同一个段内完成, 在指令中指出所使用的寄存器或存储单元的偏移地址, 当采用存储单元保存转移地址时, 可以采用以上介绍的 5 种存储器寻址方式 例如 : JMP BX ; 程序转移的目的地址为 BX 的内容 JMP VAR1 ; 程序转移的目的地址为字型变量 VAR1 的内容 JMP VAR1[SI] ; 目的地址保存在存储器, 其有效地址为 (SI)+OFFSET VAR1
3.3 转移地址的寻址方式 例 : 若 (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
3.3 转移地址的寻址方式 段间转移地址的寻址方式 (CS IP 均发生改变 ) 只适合于无条件转移指令 1. 段间直接寻址 Direct addressing between different segments 段间直接寻址是指直接在指令中给出转移目的地址 (16 位偏移地址和 16 位段地址 ), 转移在不同段之间完成 指令中用 JMP < 标号 > 表示, 当然这里的标号与该指令处在不同的段 例如 : JMP LABEL ; 程序转移到标号 LABEL 处执行 (LABEL 不在本段中 )
3.3 转移地址的寻址方式 XXH 操作码 SEG LABEL **H **H OFFSET LABEL????:****H??H??H JMP FAR PTR LABEL ; LABEL: 2 代码段 2 代码段 1
3.3 转移地址的寻址方式 2. 段间间接寻址 Indirect addressing between different segments 段间间接寻址是指转移目的地址 (32 位地址 ) 保存在存储单元中, 转移在不同的段之间完成, 在指令中指出存储单 元的偏移地址, 可以采用以上介绍的 5 种存储器寻址方式 存储单元必须是双字型变量, 第一个字用于存放目的地址的段内偏移地址, 第二个字用于存放目的地址的段地址 例如 : JMP VAR3 JMP VAR1[BX] ; 程序转移的目的地址为双字型变量 VAR3 的内容 ; 目的地址保存在存储器, 其有效 地址为 (BX)+OFFSET VAR1
3.3 转移地址的寻址方式 存放转移地址的首址 低字节 高字节 低字节 高字节 转移 OFFSET IP 转移 SEG 地址 CS 存储器
3.3 转移地址的寻址方式 如 :JMP DWORD PTR [BX][DI] 若 (DS)=3000H,(BX)=1000H,(BX)=1000H (DI)=2000H, 则 : DS: 3 0 0 0 33000H 05H 00H BX: 1 0 0 0 20H IP DI: + 2 0 0 0 00H 3 3 0 0 0 H 80H CS CS: 8 0 0 0 IP: + 2 0 0 0 8 2 0 0 0 H 82000H 目的地址
3.3 转移地址的寻址方式 综上所述, 转移地址的 4 种寻址方式也可以从指令形式加以区分, 即 : 转移地址 寻址方式 段内直接寻址 ( LABEL 在本段内 ) JMP LABEL 段间直接寻址 ( LABEL不在本段 ) JMP REG16 段内间接寻址 段内间接寻址 ( MEM为字型 ) JMP MEM 段间间接寻址 ( MEM为双字型 )
作业 指出第 4 题 (1-10) 第 6 题