微机第二章 8086处理器指令_第1页
微机第二章 8086处理器指令_第2页
微机第二章 8086处理器指令_第3页
微机第二章 8086处理器指令_第4页
微机第二章 8086处理器指令_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章第二章 处理器指令处理器指令 一 微机在实地址模式下的寄存器 1 Pentium 处理器的工作模式 Inter 系列的微处理器从 80386 开始就具备了 3 种工作模式 到 80486DX 又增加了 1 种工作模式 这 4 种工作模式都被 Pentium 继承下来并一直延续到 Pentium 和 Pentium 4 这 4 种状态分别是 实地模式 虚地址保护模式 虚拟 8086 模式和系统管理模式 1 实地址模式 系统启动后 Pentium 自动进入实地址模式 在此模式下 采用类似于 8086 的体系结构 Pentium 在实地址模式下的寻址方式 存储器管理 中断处理与 8086 的一 样 操作数默认长度为 16 位 但如果在指令前加前缀也允许访问 32 位寄存器 在实地址模式下不用虚拟地址 最大地址范围仍限于 1MB 只采用分段方式 每段最大 64KB 尽管 Pentium 有 4 个特权级 但在实地址模式下 程序在最高 级 0 级上执行 也就是说用户此时和操作系统拥有一样的级别 2 保护模式 所谓保护是指在执行多任务操作时 对不同任务使用的虚拟存储器空间进 行完全的隔离 保护每个任务顺利执行 保护模式是 80386 及以后的微机常用的模式 系统启动后先进入实地址模 式 完成系统初始化后立即转到保护模式 这种保护模式提供了多任务环境下 的各种复杂功能以及对复杂存储器组织的管理机制 只有在保护模式下 Pentium 才发挥其强大的功能 在保护模式下 Pentium 具有如下特点 存储器采用虚拟地址空间 线性 地线空间和物理地址空间三种方式来描述 在保护模式下 Pentium 寻址机构 是通过描述符这种数据结构来实现对内存访问的 Pentium 可以寻址的空间大 至 64TB 这个空间就是所谓的虚拟地址空间 在保护模式下 可以使用 48 2 Pentium 的 4 级保护功能 实现程序与程序 用户与用户及用户与操作系统之 间的隔离和保护 为多任务操作系统提供优化支持 只是在保护模式下 Pentium 就能启动其分页单元 以支持虚拟内存 3 虚拟 8086 模式 所谓虚拟 8086 模式是指一个多任务的环境 Multitasking 即模拟多个 8086 的工作模式 在这个模式下 Pentium 被模拟成多个 8086 微处理器并行工 作 虚拟 8086 模式允许 Pentium 将内存划分成若干部分 每个部分由操作系统 分配给不同的应用程序 而应用程序 数据以及内存管理程序等部分则存放在 所分配的内存中 因此 操作系统可根据时间上的平均分配或优先权 分配每 个应用程序的执行时间 在虚拟 8086 模式下可执行原来采用 8086 指令书写的应用程序 段寄存器 的用法与实地址模式一样 即段寄存器内容乘以 16 后加上偏移量即可得到 20 位的线性地址 虚拟地址模式下可以使用分页方式 比如将 1MB 分为 256 个页 面 分页内存是将内存以 4KB 为单位进行划分 每一个 4KB 称为一 页 因此 可以比段寻址方式划分的细 从而可处理较小的应用程序与数据段 尽管在虚 拟 86 模式下得到的线性地址是 20 位即 1MB 的空间 但由于线性地址可以通过 页表映射到任何 32 位物理地址 因此应该程序可以在 Pentium 现有实际内存的 任何地方执行 在 Pentium 多任务系统中 可以使其中一个或几个任务使用虚 拟 8086 模式 此时 一个任务所用的全部页面可以定位于某个物理地址空间 另一个任务的页面可以定位于其他区域 即每个虚拟 8086 模式下的任务可以转 换到物理存储器的不同位置 这样 把存储器虚拟化了 故称之为虚拟 8086 模 式 在虚拟 8086 模式中 应用程序在最低特权级 3 级上运行 因此 Pentium 指 令不能使用 表 2 1 列出了实地址模式与虚拟 8086 模式的主要区别 表 2 1 实地址模式与虚拟 8086 模式的主要区别 实地址模式虚拟 8086 模式 内存管理分段管理即分段又分页 存储空间 1MB 每个 8086 程序任务寻址 1MB 总寻址空间 4GB 多任务不支持支持 虚拟 8086 模式是 Pentium 保护模式中多任务的 一个任务 应该注意 在开机或复位时 Pentium 总是自动进入实地址模式 在实地 址模式下 执行保护模式的初始化后 利用 MOV CR0 reg 指令修改机器控制寄 存器 使 PE 1 进入保护模式 如果要从保护模式回到实地址模式 则可用指 令 MOV CR0 reg 使 PE 0 3 系统管理模式 系统管理模式 System Management Mode SMM 的功能主要包括电源管理 以及为操作系统和正在运行的程序提供安全性 而 SMM 最显著的应用就是电源 管理 SMM 可以使处理器和系统外围部件都休眠一定时间 然后在有一键按下 或鼠标移动时能自动唤醒它们 并使之继续工作 此外 SMM 还可以完全控制 整个系统 包括 I O 和全部 RAM 利用 SMM 可实现软件关机 Windows95 98 或 NT 等 2 8086 寄存器的特殊用途 我们已经知道了信息在 8086 中的表示 虽然信息 对 8086 而言 实际上 就是一系列位的组合 存放在 RAM 中 但是对信息的处理实际上是 CPU 的 ALU 算术逻辑单元 中进行的 在信息处理过程中 需要在 CPU 内部辟出一块 存储区域 用来存放信息和保存中间结果 8086CPU 以一系列寄存器的形式提 供了这样的存储区域 所有的汇编语言程序都要广泛用到这些 CPU 寄存器 因 此 学会访问和使用 CPU 寄存器相当重要 8086 有八个十六位通用寄存器 其名称分别为 AX BX CX DX BP SI DI SP 其中前四个寄存器 也可以用作八位寄存器对 图 2 1 给出了这些八位寄存器的名称 这些八位寄存器名称的首字母与相应的十 六位寄存器相同 第二个字母分别是 H 和 L 分别代表相应的十六位寄存器的 高半部分和低半部分 因此 AX 寄存器的高位字节和低位字节分别称为 AH 和 AL AX BX CX DX AHAL BHBL CH CL DHDL 16 bit bytebyte 数据寄存器 SI DI BP SP 索引寄存器 基指针 堆栈指针 CS DS SS ES 代码 数据 堆栈 附加 图2 1 8086寄存器 虽然名义上说它们都是通用寄存器 但是实际上每个寄存器都有一些特定 的用途 比如说 CX 寄存器用作移位和循环指令的计数器 SP 寄存器用作堆栈 指针 见表 2 2 类似地 AX 寄存器常称为累加器 意指用在许多算术和输入 出指令中 表 2 2 8086 寄存器的特殊用途 符号名称特殊用途 AX 累加器算术操作 端口输入 出 BX 基地址数据结构的起始地址 CX 计数器循环计数器 移位计数器 DX 数据算术操作 输入 出地址 SP 堆栈指针当前栈顶偏移 BP 基指针指向堆栈结构的指针 SI 源索引字符串指令 DI 目标索引字符串指令 8086 如何寻址内存呢 它借用了段和偏移的概念 每个段实际上就是一块内存 其大小可高达 64K 8086 之所以提供四个专用寄存器就是因为这种分段内存寻 址策略 这些专用寄存器称为段寄存器 其名称分别为 CS DS SS 和 ES 它们分 别用来存放代码段 数据段 堆栈段和附加段的段地址 CS IP 控制 所谓代码段指的是其间含有 8086 要执行的指令的一块内存 CS 寄存器中存 放的是该块内存的起始地址 IP 指令指针 寄存器中存放的是要执行的下一 条指令的偏移 本章后面将要介绍偏移的情况 该指针的完整地址经常表示成 CS IP 用一个冒号将段寄存器名称和存放偏移值得寄存器名称分隔开来 因 为改变 CS IP 或者同时改变 CS IP 中的值 将导致程序的执行流发生变化 所以 CS IP 经常称为控制 像 call 和 jmp 这样的能够改变 CS IP 内容的指令称 为控制转移指令 SS SP 堆栈 如同 CS 和 IP 总是成对出现一样 SS 和 SP 也总是成对出现 SS IP 用来确 定堆栈地址 所谓堆栈就是用作后进先出存储区域的一块内存 BP 寄存器用于 寻址堆栈中的内存位置 段寄存器 DS 和 ES DS 数据段 和 ES 附加段 段寄存器是专门用于寻址数据的 借助于这 两个寄存器 可以同时访问 2 段数据 每一段数据可多达 64K 字节 BX 寄存器 与 DS 相联 用来确定数据在 SI 和 DI 寄存器来访问数组 字符串 中的单个字 节或字 这些指令将 SI 与 DS DI 与 ES 相关联起来 标志寄存器 除了前面介绍的寄存器外 8086 还提供了一个用来表明算术逻辑操作结果 的寄存器 例如 在将两个数相减后 我们可能想知道结果值是否为 0 以便 确定这两个数是否相等 8086 将结果信息存放在一个十六位寄存器的某一位中 这个十六位寄存器称为标志寄存器 这一位称为零标志 IF 位 如果结果的 是 0 CPU 就将零标志位置成 1 可以通过某些专门为此目的推出的指令 如 jz 和 jnz 检验标志值 然后根据实际情况进行相应的动作 作为一个汇编语言 设计人员 应当认识到标志值的重要性 在进行条件判断时经常要用到这些标 志值 标志寄存器如图 2 2 所示 151413121110987654321 0 图2 2 8086标志寄存器 OFDFIFTFSFZFAFPFCF 8086 标志寄存器共有九个标志 每个标志占用标志寄存器中的一位 其中 6 个标志用来处理器在执行完一条指令后的状态 另外三个标志用来控制 8086 操作 状态标志有 进位标志 检验标志 辅助进位标志 零标志 符号标志 和溢出标志 3 数据传送指令 向 从内存传送数据 由于一个程序的数据驻留在计算机内存中 而操作却在 CPU 中执行 所以 汇编语言程序中最常见的任务就是将数据在内存和 CPU 寄存器之间来回传送 MOV 指令时传送数据的主要手段 该指令的使用相当频繁 几乎找不到有哪一 个 MASM 程序能不用它 MOV 指令有两个操作数 其句法形式如下 MOV destination source 该指令的作用就是将数据从源传送至目标 并且不破坏源值 例如 指令 MOV bx ax 的作用就是将 AX 寄存器中存放的值拷贝进 BX 寄存器中 MOV 指令中 允许有多种源 source 和目标 destination 操作数的组 合 具体如何组合还要取决于操作数是寄存器 立即数还是内存单元 但下列 组合不允许 1 目标 destination 操作数不能是 CS 寄存器 这样做可以防止 CS 寄存 器被修改 CS 段寄存器总是指向当前正执行的代码所在的段地址 在执行 期间改变 CS 值显然不明智 改变 CS 值的唯一合法的方法是作用 int jmp call 或 ret 指令 2 源和目标操作数不能都是内存操作数 这条限制只用于需要两个操作数 的所有 80 x86 指令 由于设计时强加的限制 80 x86 系列处理器不允许直接 对两个内存操作数进行操作 3 如果源操作数是立即数 则目标操作数不能再有段寄存器 4 目标操作数不能是立即操作数 这个限制来源于下列事实 立即操作数 是嵌在指令中的 若允许向立即操作数传送数据 则将导致代码修改它本身 这不是良好的程序设计方法 将数据从一个内存位置传送至另一个内存位置 假定我们想将变量 count 的内容拷贝进另一个变量 lastcount 中 虽然不允 许出现指令 mov lastcount count 但可以通过两条 MOV 指令以间接的方式达到 目的 count DW 定义 WORD lastcount DW mov ax count mov lastcount ax 这个例子以 AX 寄存器为中介 先将 count 值拷贝进 AX 中 再通过第二条 MOV 指令将 count 值从 AX 中拷贝至 lastcount 借助于这种方法 完全可以将 单个数据项从一个内存单元传送至另一个内存单元 堆栈管理 从技术角度看 堆栈就是一个后进先出 LIFO 式数据结构 在 80 x86 微 处理器中 堆栈是通过一块连续内存区域实现的 堆栈底部位于堆栈段中最高 地址处 然后向下生长 参见图 2 3 当前栈顶中存放着最后进入堆栈的元素 栈顶位置有 SP 寄存器值决定 堆栈就像是一块临时存储区域 因为寄存器数目 有限 所以 在将一个寄存器用作另一个指令的操作数前 总要先保存这个寄 存器内容 例如 在用 mul 指令计算两个整数相乘时 其中一个因子值就必须 存放在 AX 寄存器中 如果以前已将一个重要数据送入了 AX 此时该怎么办呢 堆栈最合适处理这种情形 可通过 push AX 指令将 AX 值压入堆栈保存起来 待 处理完乘法后 再通过 pop AX 指令从堆栈中弹出原先的内容 进行恢复 pop SP push SS 图2 3 80 x86中的堆栈 1 byte call int ret 和 iret 指令在保存和恢复返回地址时将自动借助于堆栈来实现 下面将要介绍 还可以通过堆栈向汇编语言过程传递参数 实际上 诸如 C PASCAL 和 FORTRAN 之类的高级语言都利用堆栈向函数和子程序传递参数 I O 端口数据传送 要处理的数据有时并不在内存中 而来自与外部源 例如 在串行通信中 发送和接收字符都要通过串行端口进行 打印文件时 要打印的数据送至打印 机端口 出于这方面考虑 80 x86 微处理器提供了特殊的 I O 指令 借助于 in 和 out 指令 可通过 I O 端口一次传送一个字节或一个字 80188 和 80186 以 后的微处理器 80286 80386 和 80486 还提供了字符串 I O 指令 即 ins 和 outs 用来传送一组字节 Inter 80 x86 体系结构规定 I O 端口地址是 16 位 所以 最多可有 65 536 个 I O 端口 但大多数 PC 兼容的外部设备卡都只使用地址中的低 10 位 除特殊情况外 很少有 I O 地址超过 3FFh In 指令从指定端口读取一个字节或一个字 送入 AL 或 AX AL 寄存器用于 字节传送 AX 寄存器用于字传送 out 指令将 AL 或 AX 值写入指定 I O 端口 端口号可以是一个 8 位的立即数 也可以是存放在 DX 中的一个字 因为一个 8 位立即数最大只能表示 255 所以立即数操作数只能用于小于 255 的端口地址 例如 可以读写 I O 端口 20h 和 21h 的内容控制 PC 机中的 8259 可编程中断控 制器 下面给出一个例子 in al 21h 读端口 21h mov al 20h 值送入 AL out 20h al 发往端口 20h 当 I O 端口地址大于 OFFh 时 应将端口地址存放在 DX 中 PC 机中第一个串行 端口使用的地址就是从 3F8h 到 3FEh 端口 3FDhA 中存放着通信线的状态 可 通过下列代码将该状态读进 AL mov dx 3fdh 先将端口地址送入 DX in al dx 再读端口 IN 输入指令 功能 本指令完成把一个字节或一个字由一个指定的输入端口 传送到 AL 若是一个字节 端口地址可以是一个立即数 在 0 255 之间 也可以包括在寄存器 dx 中 若指令中的累加器为 AL 则表示传送 一个字节 相反 若指令中的累加器为 AX 则表示传送一个字 句法 IN 累加器 立即数 IN 累加器 DX 标志位 标志位均不受影

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论