




已阅读5页,还剩1285页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章基础知识 1 1机器语言1 9数据总线1 2汇编语言的产生1 10控制总线1 3汇编语言的组成1 11内存地址空间 概述 1 4存储器1 12主板1 5指令和数据1 13接口卡1 6存储单元1 14各类存储器芯片1 7CPU对存储器的读写1 15内存地址空间1 8地址总线 引言 汇编语言是直接在硬件之上工作的编程语言 首先要了解硬件系统的结构 才能有效的应用汇编语言对其编程 在本章中 对硬件系统结构的问题进行一部分的探讨 以使后续的课程可在一个好的基础上进行 引言 当课程进行到需要补充新的基础知识 关于编程结构或其他的 时候 再对相关的基础知识进行介绍和探讨 本书的原则是 以后用到的知识 以后再说 引言 汇编课程的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活的控制系统进行工作 1 1机器语言 机器语言是机器指令的集合 机器指令展开来讲就是一台机器可以正确执行的命令 1 1机器语言 指令 01010000 PUSHAX 电平脉冲 1 1机器语言 以后我们提到的计算机是指由CPU和其他受CPU直接或间接控制的芯片 器件 设备组成的计算机系统 比如我们最常见的PC机 1 1机器语言 程序员们将0 1数字编程的程序代码打在纸带或卡片上 1打孔 0不打孔 再将程序通过纸带机或卡片机输入计算机 进行运算 示例应用8086CPU完成运算 S 768 12288 1280 1 1机器语言 S 768 12288 1280机器码 101100000000000000000011000001010000000000110000001011010000000000000101假如将程序错写成以下这样 请找处错误 101100000000000000000011000001010000000000110000000101101000000000000101 1 1机器语言 在显示器上输出 welcometomasm 机器码看到这样的程序 你会有什么感想 如果程序里有一个 1 被误写为 0 又如何去查找呢 1 2汇编语言的产生 汇编语言的主体是汇编指令 汇编指令和机器指令的差别在于指令的表示方法上 汇编指令是机器指令便于记忆的书写格式 汇编指令是机器指令的助记符 1 2汇编语言的产生 机器指令 1000100111011000操作 寄存器BX的内容送到AX中汇编指令 MOVAX BX这样的写法与人类语言接近 便于阅读和记忆 寄存器 寄存器 简单的讲是CPU中可以存储数据的器件 一个CPU中有多个寄存器 AX是其中一个寄存器的代号 BX是另一个寄存器的代号 更详细的内容我们在以后的课程中将会讲到 1 2汇编语言的产生 计算机能读懂的只有机器指令 那么如何让计算机执行程序员用汇编指令编写的程序呢 用汇编语言编写程序的工作过程 1 3汇编语言的组成 汇编语言由以下3类组成 1 汇编指令 机器码的助记符 2 伪指令 由编译器执行 3 其它符号 由编译器识别 汇编语言的核心是汇编指令 它决定了汇编语言的特性 1 4存储器 CPU是计算机的核心部件 它控制整个计算机的运作并进行运算 要想让一个CPU工作 就必须向它提供指令和数据 指令和数据在存储器中存放 也就是平时所说的内存 1 4存储器 在一台PC机中内存的作用仅次于CPU 离开了内存 性能再好的CPU也无法工作 1 4存储器 磁盘不同于内存 磁盘上的数据或程序如果不读到内存中 就无法被CPU使用 1 5指令和数据 指令和数据是应用上的概念 在内存或磁盘上 指令和数据没有任何区别 都是二进制信息 1 5指令和数据 二进制信息 1000100111011000 89D8H 数据 1000100111011000 MOVAX BX 程序 1 6存储单元 存储器被划分为若干个存储单元 每个存储单元从0开始顺序编号 例如 一个存储器有128个存储单元 编号从0 127 如右图示 1 6存储单元 对于大容量的存储器一般还用以下单位来计量容量 以下用B来代表Byte 1KB 1024B1MB 1024KB1GB 1024MB1TB 1024GB磁盘的容量单位同内存的一样 实际上以上单位是微机中常用的计量单位 1 7CPU对存储器的读写 CPU要想进行数据的读写 必须和外部器件 标准的说法是芯片 进行三类信息的交互 存储单元的地址 地址信息 器件的选择 读或写命令 控制信息 读或写的数据 数据信息 1 7CPU对存储器的读写 那么CPU是通过什么将地址 数据和控制信息传到存储芯片中的呢 电子计算机能处理 传输的信息都是电信号 电信号当然要用导线传送 1 7CPU对存储器的读写 在计算机中专门有连接CPU和其他芯片的导线 通常称为总线 物理上 一根根导线的集合 逻辑上划分为 地址总线数据总线控制总线图示 1 7CPU对存储器的读写 总线在逻辑上划分的图示 1 7CPU对存储器的读写 CPU在内存中读或写的数据演示 读演示写演示从上面我们知道CPU是如何进行数据读写的 可是我们如何命令计算机进行数据的读写呢 1 7CPU对存储器的读写 1 7CPU对存储器的读写 1 7CPU对存储器的读写 对于8086CPU 下面的机器码能够完成从3号单元读数据 机器码 101000000000001100000000含义 从3号单元读取数据送入寄存器AXCPU接收这条机器码后将完成上面所述的读写工作 1 7CPU对存储器的读写 机器码难于记忆 用汇编指令来表示 情况如下 机器码 101000000000001100000000对应的汇编指令 MOVAX 3 含义 传送3号单元的内容到AX 1 8地址总线 CPU是通过地址总线来指定存储单元的 地址总线上能传送多少个不同的信息 CPU就可以对多少个存储单元进行寻址 1 8地址总线 地址总线发送地址信息演示 1 8地址总线 1 8地址总线 一个CPU有N根地址总线 则可以说这个CPU的地址总线的宽度为N 这样的CPU最多可以寻找 的N次方个内存单元 1 9数据总线 CPU与内存或其它器件之间的数据传送是通过数据总线来进行的 数据总线的宽度决定了CPU和外界的数据传送速度 1 9数据总线 我们来分别看一下它们向内存中写入数据89D8H时 是如何通过数据总线传送数据的 8088CPU数据总线上的数据传送情况8086CPU数据总线上的数据传送情况 1 9数据总线 8位数据总线上传送的信息 1 9数据总线 16位数据总线上传送的信息 1 10控制总线 CPU对外部器件的控制是通过控制总线来进行的 在这里控制总线是个总称 控制总线是一些不同控制线的集合 有多少根控制总线 就意味着CPU提供了对外部器件的多少种控制 所以 控制总线的宽度决定了CPU对外部器件的控制能力 控制总线上发送的控制信息 1 10控制总线 1 10控制总线 前面所讲的内存读或写命令是由几根控制线综合发出的 其中有一根名为读信号输出控制线负责由CPU向外传送读信号 CPU向该控制线上输出低电平表示将要读取数据 有一根名为写信号输出控制线负责由CPU向外传送写信号 1 1节 1 10节小结 1 汇编指令是机器指令的助记符 同机器指令一一对应 2 每一种CPU都有自己的汇编指令集 1 1节 1 10节小结 3 CPU可以直接使用的信息在存储器中存放 4 在存储器中指令和数据没有任何区别 都是二进制信息 1 1节 1 10节小结 5 存储单元从零开始顺序编号 6 一个存储单元可以存储8个bit 用作单位写成 b 即8位二进制数 7 1B 8b1KB 1024B1MB 1024KB1GB 1024MB 1 1节 1 10节小结 续 8 每一个CPU芯片都有许多管脚 这些管脚和总线相连 也可以说 这些管脚引出总线 一个CPU可以引出三种总线的宽度标志了这个CPU的不同方面的性能 地址总线的宽度决定了CPU的寻址能力 数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量 控制总线宽度决定了CPU对系统中其它器件的控制能力 1 1节 1 10节小结 续 在汇编课程中 我们从功能的角度介绍了这三类总线 对实际的连接情况不做讨论 特别提示 特别提示 检测点1 1 Page8 没有通过检测点请不要向下学习 1 11内存地址空间 概述 什么是内存地址空间呢 一个CPU的地址线宽度为10 那么可以寻址1024个内存单元 这1024个可寻到的内存单元就构成这个CPU的内存地址空间 下面深入讨论 首先需要介绍两部分基本知识 主板和接口卡 1 12主板 在每一台PC机中 都有一个主板 主板上有核心器件和一些主要器件 这些器件通过总线 地址总线 数据总线 控制总线 相连 1 13接口卡 计算机系统中 所有可用程序控制其工作的设备 必须受到CPU的控制 CPU对外部设备不能直接控制 如显示器 音箱 打印机等 直接控制这些设备进行工作的是插在扩展插槽上的接口卡 1 14各类存储器芯片 从读写属性上看分为两类 随机存储器 RAM 和只读存储器 ROM 从功能和连接上分类 随机存储器RAM装有BIOS的ROM接口卡上的RAMPC机中各类存储器的逻辑连接情况 1 14各类存储器芯片 装有BIOS的ROMBIOS BasicInput OutputSystem 基本输入输出系统 BIOS是由主板和各类接口卡 如 显卡 网卡等 厂商提供的软件系统 可以通过它利用该硬件设备进行最基本的输入输出 在主板和某些接口卡上插有存储相应BIOS的ROM 1 15内存地址空间 上述的那些存储器在物理上是独立的器件 但是它们在以下两点上相同 1 都和CPU的总线相连 2 CPU对它们进行读或写的时候都通过控制线发出内存读写命令 1 15内存地址空间 将各各类存储器看作一个逻辑存储器 所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器 每个物理存储器在这个逻辑存储器中占有一个地址段 即一段地址空间 CPU在这段地址空间中读写数据 实际上就是在相对应的物理存储器中读写数据 1 15内存地址空间 假设 上图中的内存空间地址段分配如下 地址0 7FFFH的32KB空间为主随机存储器的地址空间 地址8000H 9FFFH的8KB空间为显存地址空间 地址A000H FFFFH的24KB空间为各个ROM的地址空间 1 15内存地址空间 不同的计算机系统的内存地址空间分配情况是不同的 8086PC机内存地址空间分配的基本情况 8086PC机的内存地址空间分配 1 15内存地址空间 内存地址空间 最终运行程序的是CPU 我们用汇编编程的时候 必须要从CPU角度考虑问题 对CPU来讲 系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中 它的容量受CPU寻址能力的限制 这个逻辑存储器即是我们所说的内存地址空间 小结 汇编语言 课件 王爽著 清华大学出版社 制作工具 MicrosoftPowerPoint2003 本课件由汇编网 制作提供 第2章寄存器 CPU工作原理 2 1通用寄存器2 2字在寄存器中的存储2 3几条汇编指令2 4物理地址2 516位结构的CPU2 68086CPU给出物理地址的方法 2 7 段地址 16 偏移地址 物理地址 的本质含义2 8段的概念2 9段寄存器2 10CS和IP2 12代码段 CPU概述 一个典型的CPU由运算器 控制器 寄存器等器件组成 这些器件靠内部总线相连 内部总线实现CPU内部各个器件之间的联系 外部总线实现CPU和主板上其它器件的联系 寄存器概述 8086CPU有14个寄存器它们的名称为 AX BX CX DX SI DI SP BP IP CS SS DS ES PSW 这些寄存器以后会陆续介绍 2 1通用寄存器 8086CPU所有的寄存器都是16位的 可以存放两个字节 AX BX CX DX通常用来存放一般性数据被称为通用寄存器 下面以AX为例 我们看一下寄存器的逻辑结构 一个16位寄存器可以存储一个16位的数据 数据的存放情况 一个16位寄存器所能存储的数据的最大值为多少 答案 216 1 2 1通用寄存器 16位数据在寄存器中的存放情况 数据 18二进制表示 10010在寄存器AX中的存储 16位数据在寄存器中的存放情况 数据 20000二进制表示 0100111000100000在寄存器AX中的存储 2 1通用寄存器 8086上一代CPU中的寄存器都是8位的 为保证兼容性 这四个寄存器都可以分为两个独立的8位寄存器使用 AX可以分为AH和AL BX可以分为BH和BL CX可以分为CH和CL DX可以分为DH和DL 8086CPU的8位寄存器存储逻辑 2 1通用寄存器 以AX为例 8086CPU的16位寄存器分为两个8位寄存器的情况 2 1通用寄存器 AX的低8位 0位 7位 构成了AL寄存器 高8位 8位 15位 构成了AH寄存器 AH和AL寄存器是可以独立使用的8位寄存器 8086CPU的8位寄存器数据存储情况一个8位寄存器所能存储的数据的最大值是多少 答案 28 1 2 1通用寄存器 2 2字在寄存器中的存储 一个字可以存在一个16位寄存器中 这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中 关于数制的讨论 由于一个内存单元可以存放8位数据 CPU中的寄存器又可存放n个8位数据 也就是说 计算机中的数据大多是由1 N个8位数据构成的 用十六进制来表示数据可以直观的看出这个数据是由哪些8位数据构成的 示例 2 3几条汇编指令 汇编指令不区分大小写 2 3几条汇编指令 CPU执行下表中的程序段的每条指令后 对寄存器中的数据进行的改变 2 3几条汇编指令 2 3几条汇编指令 这里的丢失 指的是进位制不能在8位寄存器中保存 但是CPU不是并真的不丢弃这个进位值 这个问题会在后面的课程中讨论 特别提示 检测点2 1 Page18 没有通过检测点请不要向下学习 2 4物理地址 CPU访问内存单元时要给出内存单元的地址 所有的内存单元构成的存储空间是一个一维的线性空间 每一个内存单元在这个空间中都有唯一的地址 这个唯一的地址称为物理地址 2 516位结构的CPU 概括的讲 16位结构描述了一个CPU具有以下几个方面特征 1 运算器一次最多可以处理16位的数据 2 寄存器的最大宽度为16位 3 寄存器和运算器之间的通路是16位的 2 68086CPU给出物理地址的方法 8086有20位地址总线 可传送20位地址 寻址能力为1M 8086内部为16位结构 它只能传送16位的地址 表现出的寻址能力却只有64K 2 68086CPU给出物理地址的方法 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址 8086CPU相关部件的逻辑结构 在8086CPU内部用两个16位地址合成的方法来形成一个20位的物理地址 地址加法器 地址加法器合成物理地址的方法 物理地址 段地址 16 偏移地址例如 8086CPU访问地址为123C8H的内存单元由段地址 16引发的讨论 观察移位次数和各种形式数据的关系 1 一个数据的二进制形式左移1位 相当于该数据乘以2 2 一个数据的二进制形式左移N位 相当于该数据乘以2的N次方 3 地址加法器如何完成段地址 16的运算 以二进制形式存放的段地址左移4位 由段地址 16引发的讨论 2 7 段地址 16 偏移地址 物理地址 的本质含义 两个比喻说明 说明 基础地址 偏移地址 物理地址 的思想 第一个比喻说明 段地址 16 偏移地址 物理地址 的思想 第二个比喻8086CPU就是这样一个只能提供两张3位数据纸条的CPU 基础地址 偏移地址 物理地址 比如说 学校 体育馆同在一条笔直的单行路上 学校位于路的起点0米处 读者在学校 要去图书馆 问我那里的地址 我可以用几种方式描述这个地址 基础地址 偏移地址 物理地址 1 从学校走2826m到图书馆 这2826可以认为是图书馆的物理地址 2 从学校走2000m到体育馆 从体育馆再走826m到图书馆 第一个距离2000m是相对于起点的基础地址 第二个距离826m是将对于基础地址的偏移地址 段地址 16 偏移地址 物理地址 比如我们只能通过纸条来通信 读者问我图书馆的地址 我只能将它写在纸上告诉读者 显然我必须有一张可以容纳4位数据的纸条才能写下2826这个数据 段地址 16 偏移地址 物理地址 不巧的是 没有能容纳4位数据的纸条 仅有两张可以容纳3位数据的纸条 这样我只能以这种方式告诉读者2826这个数据 2 8段的概念 错误认识 内存被划分成了一个一个的段 每一个段有一个段地址 其实 内存并没有分段 段的划分来自于CPU 由于8086CPU用 段地址 16 偏移地址 物理地址 的方式给出内存单元的物理地址 使得我们可以用分段的方式来管理内存 2 8段的概念 我们可以认为 地址10000H 100FFH的内存单元组成一个段 该段的起始地址 基础地址 为10000H 段地址为1000H 大小为100H 2 8段的概念 我们也可以认为地址10000H 1007FH 10080H 100FFH的内存单元组成两个段 它们的起始地址 基础地址 为10000H和10080H 段地址为 1000H和1008H 大小都为80H 2 8段的概念 以后 在编程时可以根据需要 将若干地址连续的内存单元看作一个段 用段地址 16定位段的起始地址 基础地址 用偏移地址定位段中的内存单元 两点需要注意内存单元地址小结特别提示 两点需要注意 1 段地址 16必然是16的倍数 所以一个段的起始地址也一定是16的倍数 2 偏移地址为16位 16位地址的寻址能力为64K 所以一个段的长度最大为64K 内存单元地址小结 CPU访问内存单元时 必须向内存提供内存单元的物理地址 8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址 思考两个问题 1 观察下面的地址 读者有什么发现 结论 CPU可以用不同的段地址和偏移地址形成同一个物理地址 内存单元地址小结 内存单元地址小结 2 如果给定一个段地址 仅通过变化偏移地址来进行寻址 最多可以定位多少内存单元 结论 偏移地址16位 变化范围为0 FFFFH 仅用偏移地址来寻址最多可寻64K个内存单元 比如 给定段地址1000H 用偏移地址寻址 CPU的寻址范围为 10000H 1FFFFH 内存单元地址小结 在8086PC机中 存储单元的地址用两个元素来描述 即段地址和偏移地址 数据在21F60H内存单元中 对于8086PC机的两种描述 a 数据存在内存2000 1F60单元中 b 数据存在内存的2000段中的1F60H单元中 可根据需要 将地址连续 起始地址为16的倍数的一组内存单元定义为一个段 特别提示 检测点2 2 Page23 没有通过检测点请不要向下学习 2 9段寄存器 段寄存器就是提供段地址的 8086CPU有4个段寄存器 CS DS SS ES当8086CPU要访问内存时 由这4个段寄存器提供内存单元的段地址 2 10CS和IP CS和IP是8086CPU中最关键的寄存器 它们指示了CPU当前要读取指令的地址 CS为代码段寄存器 IP为指令指针寄存器 8086PC读取和执行指令相关部件 8086PC读取和执行指令演示8086PC工作过程的简要描述 8086PC工作过程的简要描述 1 从CS IP指向内存单元读取指令 读取的指令进入指令缓冲器 2 IP IP 所读取指令的长度 从而指向下一条指令 3 执行指令 转到步骤 1 重复这个过程 8086PC工作过程的简要描述 在8086CPU加电启动或复位后 即CPU刚开始工作时 CS和IP被设置为CS FFFFH IP 0000H 即在8086PC机刚启动时 CPU从内存FFFF0H单元中读取指令执行 FFFF0H单元中的指令是8086PC机开机后执行的第一条指令 2 10CS和IP 内存中指令和数据没有任何区别 都是二进制信息 CPU在工作的时候把有的信息看作指令 有的信息看作数据 CPU根据什么将内存中的信息看作指令 CPU将CS IP指向的内存单元中的内容看作指令 2 10CS和IP 在任何时候 CPU将CS IP中的内容当作指令的段地址和偏移地址 用它们合成指令的物理地址 到内存中读取指令码 执行 如果说 内存中的一段信息曾被CPU执行过的话 那么 它所在的内存单元必然被CS IP指向过 2 11修改CS IP的指令 在CPU中 程序员能够用指令读写的部件只有寄存器 程序员可以通过改变寄存器中的内容实现对CPU的控制 CPU从何处执行指令是由CS IP中的内容决定的 程序员可以通过改变CS IP中的内容来控制CPU执行目标指令 我们如何改变CS IP的值呢 2 11修改CS IP的指令 8086CPU必须提供相应的指令先回想我们如何修改AX中的值 mov指令不能用于设置CS IP的值 8086CPU没有提供这样的功能 8086CPU为CS IP提供了另外的指令来改变它们的值 转移指令 如何修改AX中的值 mov指令如 movax 123mov指令可以改变8086CPU大部分寄存器的值 被称为传送指令 能够通过mov指令改变CS IP的值吗 2 11修改CS IP的指令 同时修改CS IP的内容 jmp段地址 偏移地址jmp2AE3 3jmp3 0B16功能 用指令中给出的段地址修改CS 偏移地址修改IP 2 11修改CS IP的指令 仅修改IP的内容 jmp某一合法寄存器jmpax 类似于movIP ax jmpbx功能 用寄存器中的值修改IP 内存中存放的机器码和对应汇编指令情况 初始 CS 2000H IP 0000H 请写出指令执行序列 问题分析 问题分析结果 1 movax 6622 2 jmp1000 3 3 movax 0000 4 movbx ax 5 jmpbx 6 movax 0123H 7 转到第 3 步执行 2 12代码段 对于8086PC机 在编程时 可以根据需要 将一组内存单元定义为一个段 可以将长度为N N 64KB 的一组代码 存在一组地址连续 起始地址为16的倍数的内存单元中 这段内存是用来存放代码的 从而定义了一个代码段 例如 2 12代码段 这段长度为10字节的字节的指令 存在从123B0H 123B9H的一组内存单元中 我们就可以认为 123B0H 123B9H这段内存单元是用来存放代码的 是一个代码段 它的段地址为123BH 长度为10字节 2 12代码段 如何使得代码段中的指令被执行呢 将一段内存当作代码段 仅仅是我们在编程时的一种安排 CPU并不会由于这种安排 就自动地将我们定义得代码段中的指令当作指令来执行 CPU只认被CS IP指向的内存单元中的内容为指令 所以要将CS IP指向所定义的代码段中的第一条指令的首地址 CS 123BH IP 0000H 2 9节 2 12节小结 1 段地址在8086CPU的寄存器中存放 当8086CPU要访问内存时 由段寄存器提供内存单元的段地址 8086CPU有4个段寄存器 其中CS用来存放指令的段地址 2 CS存放指令的段地址 IP存放指令的偏移地址 8086机中 任意时刻 CPU将CS IP指向的内容当作指令执行 2 9节 2 12节小结 续 3 8086CPU的工作过程 1 从CS IP指向内存单元读取指令 读取的指令进入指令缓冲器 2 IP指向下一条指令 3 执行指令 转到步骤 1 重复这个过程 4 8086CPU提供转移指令修改CS IP的内容 特别提示 检测点2 3 Page33 没有通过检测点请不要向下学习 小结 汇编语言 课件 王爽著 清华大学出版社 制作工具 MicrosoftPowerPoint2003 本课件由汇编网 制作提供 第3章寄存器 内存访问 3 1内存中字的存储3 2DS和 address 3 3字的传送3 4mov add sub指令3 5数据段3 6栈3 7CPU提供的栈机制3 8栈顶超界的问题3 9push pop指令3 10栈段 引言 在第2章中 我们主要从CPU如何执行指令的角度讲解了8086CPU的逻辑结构 形成物理地址的方法 相关的寄存器以及一些指令 这一章中 我们从访问内存的角度继续学习几个寄存器 在0地址处开始存放20000 0号单元是低地址单元 1号单元是高地址单元 3 1内存中字的存储 3 1内存中字的存储 问题 1 0地址单元中存放的字节型数据是多少 2 0地址字单元中存放的字型数据是多少 3 2地址字单元中存放的字节型数据是多少 3 1内存中字的存储 问题 续 4 2地址单元中存放的字型数据是多少 5 1地址字单元中存放的字型数据是多少 结论 3 1内存中字的存储 结论 任何两个地址连续的内存单元 N号单元和N 1号单元 可以将它们看成两个内存单元 也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元 3 2DS和 address CPU要读取一个内存单元的时候 必须先给出这个内存单元的地址 在8086PC中 内存地址由段地址和偏移地址组成 8086CPU中有一个DS寄存器 通常用来存放要访问的数据的段地址 例如 3 2DS和 address 例如 我们要读取10000H单元的内容可以用如下程序段进行 movbx 1000Hmovds bxmoval 0 上面三条指令将10000H 1000 0 中的数据读到al中 3 2DS和 address moval 0 已知的mov指令可完成的两种传送功能 1 将数据直接送入寄存器 2 将一个寄存器中的内容送入另一个寄存器中 mov指令还可以将一个内存单元中的内容送入一个寄存器 3 2DS和 address 从哪个内存单元送到哪个寄存器中呢 mov指令的格式 mov寄存器名 内存单元地址 表示一个内存单元 中的0表示内存单元的偏移地址 那么内存单元的段地址是多少呢 3 2DS和 address 执行指令时 8086CPU自动取DS中的数据为内存单元的段地址 如何用mov指令从10000H中读取数据 10000H表示为1000 0 段地址 偏移地址 将段地址1000H放入ds用moval 0 完成传送 mov指令中的 说明操作对象是一个内存单元 中的0说明这个内存单元的偏移地址是0 它的段地址默认放在ds中 如何把1000H送入ds 3 2DS和 address 如何把1000H送入ds 传送指令movax 1相似的方式movds 1000H 8086CPU不支持将数据直接送入段寄存器的操作 ds是一个段寄存器 硬件设计的问题 movds 1000H是非法的 数据 一般的寄存器 段寄存器 3 2DS和 address 问题 写几条指令 将al中的数据送入内存单元10000H 思考后分析 分析问题本质 怎样将数据从寄存器送入内存单元 结论 movbx 1000Hmovds bxmov 0 al 一种合理的回答 3 3字的传送 因为8086CPU是16位结构 有16根数据线 所以 可以一次性传送16位的数据 也就是一次性传送一个字 问题3 3 内存中的情况如右图 写出下面指令执行后寄存器ax bx cx中的值 思考后看分析 单步跟踪 3 3字的传送 问题3 3分析 问题3 4 内存中的情况如右图 写出下面指令执行后寄存器ax bx cx中的值 思考后看分析 单步跟踪 3 3字的传送 问题3 4分析 3 4mov add sub指令 已学mov指令的几种形式 mov寄存器 数据mov寄存器 寄存器mov寄存器 内存单元mov内存单元 寄存器mov段寄存器 寄存器根据已知指令进行推测 3 4mov add sub指令 根据已知指令进行推测 mov段寄存器 寄存器 mov寄存器 段寄存器 验证 mov内存单元 寄存器 mov内存单元 段寄存器 mov段寄存器 内存单元 验证 Debug mov段寄存器 寄存器 mov寄存器 段寄存器 add和sub指令同mov一样 都有两个操作对象 它们可以对段寄存器进行操作吗 请自行在Debug中试验 3 4mov add sub指令 3 5数据段 前面讲过 对于8086PC机 我们可以根据需要将一组内存单元定义为一个段 我们可以将一组长度为N N 64K 地址连续 起始地址为16的倍数的内存单元当作专门存储数据的内存空间 从而定义了一个数据段 比如我们用123B0H 123B9H这段空间来存放数据 段地址 123BH长度 10字节 3 5数据段 如何访问数据段中的数据呢 将一段内存当作数据段 是我们在编程时的一种安排 我们可以在具体操作的时候 用ds存放数据段的段地址 再根据需要 用相关指令访问数据段中的具体单元 示例 3 5数据段 我们将123B0H 123BAH的内存单元定义为数据段 我们现在要累加这个数据段中的前3个单元中的数据 代码如下 3 5数据段 问题3 5写几条指令 累加数据段中的前3个字型数据 思考后看分析 问题3 5分析 注意 一个字型数据占两个单元 所以偏移地址是0 2 4 3 1节 3 5节小结 1 字在内存中存储时 要用两个地址连续的内存单元来存放 字的低位字节存放在低地址单元中 高位字节存放再高地址单元中 2 用mov指令要访问内存单元 可以在mov指令中只给出单元的偏移地址 此时 段地址默认在DS寄存器中 3 address 表示一个偏移地址为address的内存单元 3 1节 3 5节小结 续 4 在内存和寄存器之间传送字型数据时 高地址单元和高8位寄存器 低地址单元和低8位寄存器相对应 5 mov add sub是具有两个操作对象的指令 jmp是具有一个操作对象的指令 6 可以根据自己的推测 在Debug中实验指令的新格式 特别提示 特别提示 检测点3 1 p52 没有通过检测点请不要向下学习 3 6栈 我们研究栈的角度 栈是一种具有特殊的访问方式的存储空间 它的特殊性就在于 最后进入这个空间的数据 最先出去 可以用一个盒子和3本书来描述栈的操作方式 3 6栈 栈有两个基本的操作 入栈和出栈 入栈 将一个新的元素放到栈顶 出栈 从栈顶取出一个元素 栈顶的元素总是最后入栈 需要出栈时 又最先被从栈中取出 栈的操作规则 LIFO LastInFirstOut 后进先出 3 7CPU提供的栈机制 现今的CPU中都有栈的设计 8086CPU提供相关的指令来以栈的方式访问内存空间 这意味着 我们在基于8086CPU编程的时候 可以将一段内存当作栈来使用 3 7CPU提供的栈机制 8086CPU提供入栈和出栈指令 最基本的 PUSH 入栈 POP 出栈 pushax 将寄存器ax中的数据送入栈中 popax 从栈顶取出数据送入ax 8086CPU的入栈和出栈操作都是以字为单位进行的 3 6栈 下面举例说明 我们可以将10000H 1000FH这段内存当作栈来使用 下面一段指令的执行过程 movax 0123Hpushaxmovbx 2266Hpushbxmovcx 1122Hpushcxpopaxpopbxpopcx 3 6栈 指令序列的执行过程演示注意 字型数据用两个单元存放 高地址单元放高8位 低地址单元放低8位 是否有疑惑 两个疑问 两个疑问 1 CPU如何知道一段内存空间被当作栈使用 2 执行push和pop的时候 如何知道哪个单元是栈顶单元 分析结论 任意时刻 SS SP指向栈顶元素 对于两个疑问的分析 回想 CPU如何指导当前要执行的指令所在的位置 寄存器CS和IP中存放着当前指令的段地址和偏移地址 8086CPU中 有两个寄存器 段寄存器SS存放栈顶的段地址寄存器SP存放栈顶的偏移地址任意时刻 SS SP指向栈顶元素 push指令的执行过程 pushax 1 SP SP 2 2 将ax中的内容送入SS SP指向的内存单元处 SS SP此时指向新栈顶 图示 push指令的执行过程 3 6栈 问题3 6 如果我们将10000H 1000FH这段空间当作栈 初始状态栈是空的 此时 SS 1000H SP 思考后看分析 问题3 6分析 SP 0010H 问题3 6分析 续 我们将10000H 1000FH这段空间当作栈段 SS 1000H 栈空间大小为16字节 栈最底部的字单元地址为1000 000E 任意时刻 SS SP指向栈顶 当栈中只有一个元素的时候 SS 1000H SP 000EH 问题3 6分析 续 栈为空 就相当于栈中唯一的元素出栈 出栈后 SP SP 2 SP原来为000EH 加2后SP 10H 所以 当栈为空的时候 SS 1000H SP 10H 换个角度看 问题3 6分析 续 换个角度看 任意时刻 SS SP指向栈顶元素 当栈为空的时候 栈中没有元素 也就不存在栈顶元素 所以SS SP只能指向栈的最底部单元下面的单元 该单元的偏移地址为栈最底部的字单元的偏移地址 2 栈最底部字单元的地址为1000 000E 所以栈空时 SP 0010H pop指令的执行过程 popax 1 将SS SP指向的内存单元处的数据送入ax中 2 SP SP 2 SS SP指向当前栈顶下面的单元 以当前栈顶下面的单元为新的栈顶 图示 pop指令的执行过程 注意 pop指令的执行过程 注意 出栈后 SS SP指向新的栈顶1000EH pop操作前的栈顶元素 1000CH处的2266H依然存在 但是 它已不在栈中 当再次执行push等入栈指令后 SS SP移至1000CH 并在里面写入新的数据 它将被覆盖 3 8栈顶超界的问题 SS和SP只记录了栈顶的地址 依靠SS和SP可以保证在入栈和出栈时找到栈顶 可是 如何能够保证在入栈 出栈时 栈顶不会超出栈空间 3 8栈顶超界的问题 当栈满的时候再使用push指令入栈 栈空的时候再使用pop指令出栈 都将发生栈顶超界问题 栈顶超界是危险的 3 8栈顶超界的问题 栈顶超界是危险的 因为我们既然将一段空间安排为栈 那么在栈空间之外的空间里很可能存放了具有其他用途的数据 代码等 这些数据 代码可能是我们自己的程序中的 也可能是别的程序中的 毕竟一个计算机系统并不是只有我们自己的程序在运行 3 8栈顶超界的问题 但是由于我们在入栈出栈时的不小心 而将这些数据 代码意外地改写 将会引发一连串的错误 我们当然希望CPU可以帮我们解决这个问题 3 8栈顶超界的问题 比如说在CPU中有记录栈顶上限和下限的寄存器 我们可以通过填写这些寄存器来指定栈空间的范围 然后 CPU在执行push指令的时候靠检测栈顶上限寄存器 在执行pop指令的时候靠检测栈顶下限寄存器保证不会超界 实际情况 8086CPU中并没有这样的寄存器 3 8栈顶超界的问题 8086CPU不保证对栈的操作不会超界 这就是说 8086CPU只知道栈顶在何处 由SS SP指示 而不知道读者安排的栈空间有多大 这点就好像 CPU只知道当前要执行的指令在何处 由CS SP指示 而不知道读者要执行的指令有多少 从这两点我们可以看出 3 8栈顶超界的问题 8086CPU的工作机理 只考虑当前的情况 当前栈顶在何处 当前要执行的指令是哪一条 结论 3 8栈顶超界的问题 结论 我们在编程的时候要自己操心栈顶超界的问题 要根据可能用到的最大栈空间 来安排栈的大小 防止入栈的数据太多而导致的超界 执行出栈操作的时候也要注意 以防栈空的时候继续出栈而导致的超界 3 9push pop指令 push和pop指令是可以在寄存器和内存之间传送数据的 push和pop指令的格式 栈与内存 栈空间当然也是内存空间的一部分 它只是一段可以以一种特殊的方式进行访问的内存空间 3 9push pop指令 push和pop指令的格式 1 push寄存器 将一个寄存器中的数据入栈pop寄存器 出栈 用一个寄存器接收出栈的数据例如 pushaxpopbx 3 9push pop指令 push和pop指令的格式 2 push段寄存器 将一个段寄存器中的数据入栈pop段寄存器 出栈 用一个段寄存器接收出栈的数据例如 pushdspopes 3 9push pop指令 push和pop指令的格式 3 push内存单元 将一个内存单元处的字入栈 栈操作都是以字为单位 pop内存单元 出栈 用一个内存字单元接收出栈的数据例如 push 0 pop 2 指令执行时 CPU要知道内存单元的地址 可以在push pop指令中给出内存单元的偏移地址 段地址在指令执行时 CPU从ds中取得 3 9push pop指令 问题3 7编程 将10000H 1000FH这段空间当作栈 初始状态是空的 将AX BX DS中的数据入栈 思考后看分析 问题3 7分析 3 9push pop指令 问题3 8编程 1 将10000H 1000FH这段空间当作栈 初始状态是空的 2 设置AX 001AH BX 001BH 3 将AX BX中的数据入栈 4 然后将AX BX清零 5 从栈中恢复AX BX原来的内容 思考后看分析 问题3 8分析 结论 问题3 8分析 从上面的程序我们看到 用栈来暂存以后需要恢复的寄存器中的内容时 出栈的顺序要和入栈的顺序相反 因为最后入栈的寄存器的内容在栈顶 所以在恢复时 要最先出栈 3 9push pop指令 问题3 9编程 1 将10000H 1000FH这段空间当作栈 初始状态是空的 2 设置AX 002AH BX 002BH 3 利用栈 交换AX和BX中的数据 思考后看分析 问题3 9分析 3 9push pop指令 问题3 10我们如果要在10000H处写入字型数据2266H 可以用以下的代码完成 movax 1000Hmovds axmov ax 2266Hmov 0 ax补全下面的代码 3 9push pop指令 补全下面的代码 完成同样的功能 在10000H处写入字型数据2266H movax 2266Hpushax要求 不能使用 mov内存单元 寄存器 这类指令思考后看分析 问题3 10分析 我们看需补全代码的最后两条指令 将ax中的2266H压入栈中 也就是说 最终应由pushax将2266H写入10000H处 问题的关键就在于 如何使pushax访问的内存单元是10000H Push指令是入栈指令 注意执行过程 完成程序 问题3 10分析 续 完成的程序 movax 1000Hmovss axmovsp 2movax 2266Hpushax结论 问题3 10分析 续 结论push pop实质上就是一种内存传送指令 可以在寄存器和内存之间传送数据 与mov指令不同的是 push和pop指令访问的内存单元的地址不是在指令中给出的 而是由SS SP指出的 同时 push和pop指令还要改变SP中的内容 问题3 10分析 续 我们要十分清楚的是 push和pop指令同mov指令不同 CPU执行mov指令只需一步操作 就是传送 而执行push pop指令却需要两步操作 执行push时 先改变SP 后向SS SP处传送 执行pop时 先读取SS SP处的数据 后改变SP 注意 push pop等栈操作指令 修改的只是SP 也就是说 栈顶的变化范围最大为 0 FFFFH 提供 SS SP指示栈顶 改变SP后写内存的入栈指令 读内存后改变SP的出栈指令 这就是8086CPU提供的栈操作机制 栈的综述 1 8086CPU提供了栈操作机制 方案如下 在SS SP中存放栈顶的段地址和偏移地址 提供入栈和出栈指令 他们根据SS SP指示的地址 按照栈的方式访问内存单元 2 push指令的执行步骤 1 SP SP 2 2 向SS SP指向的字单元中送入数据 3 pop指令的执行步骤 1 从SS SP指向的字单元中读取数据 2 SP SP 2 栈的综述 续 4 任意时刻 SS SP指向栈顶元素 5 8086CPU只记录栈顶 栈空间的大小我们要自己管理 6 用栈来暂存以后需要恢复的寄存器的内容时 寄存器出栈的顺序要和入栈的顺序相反 7 push pop实质上是一种内存传送指令 注意它们的灵活应用 栈是一种非常重要的机制 一定要深入理解 灵活掌握 3 10栈段 前面讲过 对于8086PC机 在编程时 我们可以根据需要 将一组内存单元定义为一个段 我们可以将长度为N N 64K 的一组地址连续 起始地址为16的倍数的内存单元 当作栈来用 从而定义了一个栈段 3 10栈段 比如我们将10010H 1001FH这段长度为16字节的内存空间当作栈来用 以栈的方式进行访问 这段空间就可以成为栈段 段地址为1000H 大小为16字节 3 10栈段 将一段内存当作栈段 仅仅是我们在编程时的一种安排 CPU并不会由于这种安排 就在执行push pop等栈操作指令时就自动地将我们定义的栈段当作栈空间来访问 如何使的如push pop等栈操作指令访问我们定义的栈段呢 将SS SP指向我们定义的栈段 3 10栈段 问题3 11如果我们将10000H 1FFFFH这段空间当作栈段 初始状态是空的 此时 SS 1000H SP 思考后看分析 问题3 11分析 我们将10000H 1FFFFH这段空间当作栈段 SS 1000H 栈空间大小为64KB 栈最底部的字单元地址为1000 FFFE 任意时刻 SS SP指向栈顶 当栈中只有一个元素的时候 SS 1000H SP FFFEH 问题3 11分析 栈为空 就相当于栈中唯一的元素出栈 出栈后 SP SP 2 SP原来为FFFEH 加2后SP 0 所以 当栈为空的时候 SS 1000H SP 0 换个角度看 问题3 11分析 续 换个角度看任意时刻 SS SP指向栈顶元素 当栈为空的时候 栈中没有元素 也就不存在栈顶元素 所以SS SP只能指向栈的最底部单元下面的单元 该单元的偏移地址为栈最底部的字单元的偏移地址 2 栈最底部字单元的地址为1000 FFFE 所以栈空时 SP 0000H 问题3 12 一个栈段最大可以设为多少 为什么 思考后看分析 问题3 12分析 一个栈段最大可以设为多少 分析 这个问题显而易见 提出来只是为了提示我们将相关的知识融会起来 首先从栈操作指令所完成的功能的角度上来看 push pop等指令在执行的时候只修改SP 问题3 12分析 所以栈顶的变化范围是0 FFFFH 从栈空时候的SP 0 一直压栈 直到栈满时SP 0 如果再次压栈 栈顶将环绕 覆盖了原来栈中的内容 所以一个栈段的容量最大为64KB 段的综述 我们可以将一段内存定义为一个段 用一个段地址指示段 用偏移地址访问段内的单元 这完全是我们自己的安排 我们可以用一个段存放数据 将它定义为 数据段 我们可以用一个段存放代码 将它定义为 代码段 我们可以用一个段当作栈 将它定义为 栈段 段的综述 续 我们可以这样安排 但若要让CPU按照我们的安排来访问这些段 就要 对于数据段 将它的段地址放在DS中 用mov add sub等访问内存单元的指令时 CPU就将我们定义的数据段中的内容当作数据段来访问 段的综述 续 对于代码段 将它的段地址放在CS中 将段中第一条指令的偏移地址放在IP中 这样CPU就将执行我们定义的代码段中的指令 段的综述 续 对于栈段 将它的段地址放在SS中 将栈顶单元的偏移地置放在SP中 这样CPU在需要进行栈操作的时候 比如执行push pop指令等 就将我们定义的栈段当作栈空间来用 段的综述 续 可见 不管我们如何安排 CPU将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年国网河南电力招聘高校毕业生笔试真题
- 2024年鞍山海城市招聘医疗岗位笔试真题
- 法律文化在社会中的表现试题及答案
- 网络管理员考试准备清单2025试题及答案
- 企业战略执行案例试题及答案
- 网络管理员培训指南试题及答案
- 网络服务监控与调优试题及答案
- 企业网管案例分析试题及答案
- 材料力学性能测试疲劳韧性重点基础知识点
- 江西省抚州市金溪县2025年八年级数学第二学期期末质量跟踪监视模拟试题含解析
- 幼儿园绘本故事:《十二生肖》 课件
- 2022年湘潭职业技术学院中职部教师招聘笔试题库及答案解析
- 双向转诊制度与流程图
- 2万吨棉杆化机浆项目可行性报告
- 施工现场防汛应急培训记录
- 果蔬干制加工技术课件
- 个人承诺书(建造师)
- 应急预案(危货运输企业)
- 氩气岗位应急处置卡
- 更换破碎机耦合器措施-
- SMT不良品维修作业指导书
评论
0/150
提交评论