- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3. 存储器寻址
这类情形最为复杂, 我们需要讨论以下三个问题: 1) 缺省的段寄存器 2) 段超越问题 3) 不同的存储器寻址方式 我们以 mem 表示存储器寻址
1)
缺省的段寄存器
8086采用段,偏移的地址转换方式,即 物理地址=段始址+段内偏移 其中,段始址20位,高16位保存在某个段寄存器 中,低4位为0,通常在指令中出现的地址为偏 移地址,而段始址可以通过缺省的段寄存器内 容(*16)求得。缺省得段寄存器究竟是哪一个, 取决于指令,寻址方式及涉及的寄存器。
•直接寻址
不涉及寄存器,操作数有效地址直接出现在指令中。例 如: 1. MOV AX, [1234] 2. MOV AX, x[1234] 缺省的段寄存器为 DS,例1 源操作数的 物理地址=(DS)*16+1234 例2 源操作数的 物理地址=(DS)*16+x+1234 这里x为符号地址,可以理解为变量
本章内容: 3.1 8086 的寻址方式 3.2 8086 的指令概况 3.3 8086 的指令系统
3.1 8086 的寻址方式
理解寻址方式,对于学习汇编语言至关重要.所谓 寻址方式就是确定操作对象的方式.依据操作对 象的不同性质,寻址方式可以分为: 3.1.1 与数据有关的寻址方式 3.1.2 与转移有关的寻址方式
而执行一条转移指令,意味着需要修改下一条指令 的地址,也就是,要根据转移指令的要求,修改CS和IP的内 容.
段内转移 转移的目标地址在当前代码段内,CS的内容不必修 改,需要将IP的内容修改为目标地址 段间转移 转移的目标地址未必在本段,CS和IP的内容都需要 修改.
段内转移 又分为段内直接转移与段内间接转移
CPU在程序运行过程中,利用内部寄存器记载下一 条指令的地址.8086采用段-偏移的地址转换方式,因此用 代码段寄存器CS和指令指针寄存器IP保存即将执行的 指令地址.其中CS保存段地址, IP保存段内偏移地址. 下一条指令的物理地址=(CS)*16+(IP).
顺序执行情形,IP的内容随指令的执行自动取得增量 (当前机器指令占据的字节数).CS的内容不发生改变.
段间转移分为段间直接转移和段间间接转移 段间直接转移的汇编指令一般要求在指令中写明 远跳转,指令格式一般是 JMP FAR PTR 〈标号〉 执行这样的指令,(IP)将取得标号的段内偏移地址, 而(CS)将取得标号所在段的段地址。汇编程序自动 将这些地址填入机器指令。例5 段间间接转移,只能是存储器寻址,存储器中连 续两个字,高位字存放新的代码段段址,低位字存放 指令指针。指令格式一般是 JMP DWORD PTR 〈存储器地址〉 存储器地址可以采用五种存储器寻址中的任何一种。 例6
例4:段内间接寻址,存储器寻址 JMP WORD PTR [TBL] JMP WORD PTR [BX+TBL] JMP WORD PTR [BP+SI+TBL] 指令执行的结果, (IP)取得指定的存储单元内容 返回
例5 段间直接转移 JMP FAR PTR LBL 其中FAR PTR 是操作符,表示直接远转移,指令执行 的操作是把 LBL 所在段地址送CS,LBL的偏移地址 送IP。 例6 段间间接转移,只能用存储器寻址 JMP DWORD PTR [TBL] JMP DWORD PTR [TBL+BP] JMP DWORD PTR [TBL+BX+DI] 指令执行的操作是,指定存储单元(双字)的高位 字送CS,低位字送IP。 返回
•基址变址相对寻址 涉及两个寄存器,其中之一为基址寄存器,另一 个为变址寄存器,带8位或16位位 移量,操作 数的有效地址等于两个寄存器内容与位移量之 和,缺省的段寄存器以及段超越的规定与基址 变址寻址相同。例 1 MOV AX, x[BX][DI] 2 MOV AX, BP[SI+x+5]
3.1.2 与转移地址有关的寻址方式
0P
s
w
如立即数为8位,但要求扩展成16位数(高位字 节按低位字节的最高有效位作符号扩展)时,s 位 为1。因此,当指令作字节操作时,sw=00;当指 令有16位立即数且作字操作时sw=01;而 当指令 有8位立即数但需要经符号扩展成16位立即数作字 操作时,则sw=11。 由于IBM PC的指令格式很多, 这里我们只作一些基本情况介绍,必要时读者可通 过查手册来了解详细情况。
间接转移 转移的目标地址在寄存器或存储器中保存,注意 间接远转移地址只能保存在寄存器中。 返回
3.2 1BM PC机的机器语言指令概况
我们用汇编语言编写的汇编语言程序输入计算机 后,由机器提供的“汇编程序”将它翻译成由机器指 令组成的机器语言程序.,才能由计算机识别并执行 。因此汇编语言程序是由汇编程序翻译成可执行的机 器语言程序的,一般说来,这一过程不必由人来干预 。我们这里只介绍一下基本原理,以便在必要时也可 完成类似的工作。 机器语言指令由操作码和地址码两部分组成,下 面分别加以说明。
3.2.1 操作码的机器语言表示 ·
IBM PC机的银器语言指令是多字节指令,一条指令 可以由1—7个字节组成。指令的操作码(用OP表示)采 用二进制代码表示本指令所执行的操作,在IBM PC机 中,它通常用指令的第一个字节表示,有时由于用8位 还不够,因此在指令的第二个字节中还可能有3位操作 码,除此以外的其他字节则用来表示地址码。在多数 操作码中,常使用某些位来指示某些信息。例如
3,2.2 寻址方式的机器语言表示 IBM PC机用一个寻址方式字节表示操作数的寻址方 式,它通常是机器指令的第二个字节。寻址方式字节 可表示如下:
mod
reg
r/m
•寄存器间接寻址
涉及一个寄存器,没有位移量,寄存器中保存操作数地 址,允许使用的寄存器为 BX, BP, SI, DI,例如: 1 MOV AX, [BX] 2 ES: MOV AX, [SI] 3. MOV AX, [BP] 用BX,SI,DI 间接寻址时,缺省的段寄存器为DS,用BP间接 寻址时,缺省的段寄存器为SS,允许段超越. 物理地址=(段寄存器)*16+(寄存器)
汇编语言中,直接转移的指令格式如下: jmp [〈类型操作符〉] 〈转移目标〉 其中类型是可选项,类型缺省时,汇编程序将根据实际情 况决定形成的指令.类型不缺省,则取值可以是 short, near ptr, far ptr
分别表示直接短,近,远转移.转移目标应该是汇编语言 源程序中某一条指令的标号.
第 3 章 8086 的指令系统
8086 的指令由操作码和操作数组成,操作码指定 进行的操作,操作数指定操作对象.有以下三种 格式: 1. 〈操作码〉 无操作数指令 2. 〈操作码〉〈操作数〉 单操作数指令 3. 〈操作码〉 〈操作数1〉 ,〈操作数2〉 两操作数指令, 最为常见, 通常操作数1为目 的操作数,操作数2为源操作数,分别简记为 DST和 SRC.
程序保存在内存中,多数情况下,按照指令在内存中 的位置,从低地址到高地址,逐条顺序执行,但循环,分支, 子程序等结构在计算机程序中是不可缺少的,使用这些 结构势必要破坏程序的自然执行顺序.于是产生一个问 题:如何决定下一条指令的位置?即与转移地址有关的寻 址方式. 8086 与转移有关的指令有无条件转移(jmp),过程调 用(call),循环(loop),条件转移和中断(int),后三种指令寻 址方式有严格规定,比较简单.前两种指令的寻址方式比 较丰富.本节以jmp为例,介绍各种寻址方式.
•段内直接转移 转移的目标地址可以直接从指令中求 得, 相当于与数据有关的寻址方式中的立即寻址 •段内间接转移 的目标地址保存在寄存器或存储器中 从指令中可以得到寄存器名或保存目标地址的 存储器地址,
段内直接转移 在汇编语言源程序中,直接转移指令是在jmp后写 跳转目标的标号.汇编程序自动计算该标号代表的地 址. 将汇编的跳转指令转换成相应的机器指令. 段内直接转移又分为直接短转移和直接近转移, 取决于目标地址与IP内容(下一条指令地址)之差(称为 位移量,位移量将出现在机器指令中).例1 位移量在字节整数范围之内(两地址之差在 -128~127字节范围内)时,位移量为8位,形成短转移, 否则,位移量为16位,形成近转移. 例2
返回
段内间接转移
跳转目标地址在寄存器或存储器中 如果是在寄存器中,则指令格式为 JMP 〈寄存器名〉 可以取八个通用16位寄存器中的任何一个,其内容 是转移目标的段内偏移地址,这种方式与数据寻址 中的寄存器寻址对应. 例3 如果是在存储器中, 则指令格式为 JMP [WORD PTR] [存储器地址] 与数据寻址中,操作数在存储器中的寻址方式对 应,可以采用五种接短转移 JMP SHORT PTR LBL LBL为标号,位移量8位,指令执行后,(IP)变为 LBL
例2:段内直接近转移 JMP NEAR PTR LBL1 LBL1为标号,位移量16位,指令执行后,(IP)变为 LBL1 返回
例3:段内间接转移,寄存器寻址 JMP AX JMP SP 指令执行的结果, (IP)取得指定的寄存器内容
1 立即寻址
操作数出现在指令中,例如 MOV AX, 256 源操作数 256 直接出现在指令中,这样的源操作数 叫做立即数. 注意:立即数不能是目的操作数,只 能是源操作数. 此后,讲解具体指令的寻址方式时,我们将以 data 表示立即寻址.
2. 寄存器寻址
操作数在寄存器中,例如: MOV AX, BX 源操作数保存在寄存器BX中,这种情况叫做寄存器寻址.注 意寄存器寻址中所说的寄存器是指8个通用寄存器.虽然 某些指令允许使用段寄存器,但那不算是寄存器寻址.此 后讲解具体指令时,遇到允许使用段寄存器寻址的情形, 我们会特别说明. 我们以 reg, segreg 分别表示寄存器寻址和段寄存器寻址
3.1.1 与数据有关的寻址方式
操作对象是数据的指令, 数据可能出现在指令中, 可能保存在寄存器中,还可能保存在存储器中, 总之有以下三类不同的寻址方式: 1. 立即寻址 操作数在指令中 2. 寄存器寻址 操作数保存在寄存器中 3. 存储器寻址 操作数保存在存储器中 我们将以两操作数指令 MOV 的源操作数寻址方 式为例解释这三类不同的寻址方式.