《汇编语言》讲稿_03

上传人:kms****20 文档编号:51270399 上传时间:2018-08-13 格式:PPT 页数:64 大小:983.50KB
返回 下载 相关 举报
《汇编语言》讲稿_03_第1页
第1页 / 共64页
《汇编语言》讲稿_03_第2页
第2页 / 共64页
《汇编语言》讲稿_03_第3页
第3页 / 共64页
《汇编语言》讲稿_03_第4页
第4页 / 共64页
《汇编语言》讲稿_03_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《《汇编语言》讲稿_03》由会员分享,可在线阅读,更多相关《《汇编语言》讲稿_03(64页珍藏版)》请在金锄头文库上搜索。

1、LOGO汇编语言课件第3 章寄存器(内存访问)v 3.1 内存中字的存储 v 3.2 DS和address v 3.3 字的传送 v 3.4 mov、add、sub指令 v 3.5 数据段 v 3.6 栈 v 3.7 CPU提供的栈机制 v 3.8 栈顶超界的问题 v 3.9 push、pop指令 v 3.10 栈段引言v在第2章中,我们主要从 CPU 如何执行 指令的角度讲解了8086CPU的逻辑结构 、形成物理地址的方法、相关的寄存器以 及一些指令。 v这一章中,我们从访问内存的角度继续学 习几个寄存器。v在0地址处开始存放 20000(4E20H)v0号单元是低地址单元 ,1号单元是高地

2、址单 元。3.1 内存中字的存储3.1 内存中字的存储v问题: (1)0地址单元中存放 的字节型数据是多少? (2)0地址字单元中存 放的字型数据是多少? (3)2地址字单元中存 放的字节型数据是多少 ?3.1 内存中字的存储v问题: (4)2地址单元中存放的 字型数据是多少? (5)1地址字单元中存放 的字型数据是多少?v结论3.1 内存中字的存储v结论:任何两个地址连续的内存单元,N号单 元和 N+1号单元,可以将它们看成两 个内存单元 ,也可以看成一个地址为 N的字单元中的高位字节单元和低位 字节单元。3.2 DS和addressvCPU要读取一个内存单元的时候,必须先 给出这个内存单元

3、的地址; v在8086PC中,内存地址由段地址和偏移 地址组成。 v8086CPU中有一个 DS寄存器,通常用 来存放要访问的数据的段地址。 v例如3.2 DS和addressv例如:我们要读取10000H单元的内容, 送入寄存器al中。3.2 DS和address已知的mov指令可完成的两种传送功能: (1)将数据直接送入寄存器; (2)将一个寄存器中的内容送入另一个寄存器中 。mov 指令 还可以将一个内存单元中的内容送入 一个寄存器。3.2 DS和addressv从哪个内存单元送到哪个寄存器中呢? vmov指令的格式:mov 寄存器名,偏移地址3.2 DS和addressv执行指令时,8

4、086CPU自动取DS中的数 据为内存单元的段地址。 v如何把1000H送入ds? 传送指令 mov ds,1000H? 8086CPU不支持将数据直接送入段寄存 器的操作,ds是一个段寄存器。 mov ds,1000H 是非法的。 数据一般的寄存器段寄存器 v正确: mov bx,1000Hmov ds,bx错误3.2 DS和address下面三条指令将10000H(1000:0)中的 数据读到al中。 mov bx,1000H mov ds,bx mov al,03.2 DS和addressv 问题:写几条指令,将al中的数据送入内存单元10000H ?(思考后分析) v 分析问题本质:怎

5、样将数据从寄存器送入内存单元? v 结论:mov bx,1000Hmov ds,bxmov 0,al3.3 字的传送v因为8086CPU是16位结构,有16根数 据线,所以,可以一次性传送16位的数据 ,也就是一次性传送一个字。v问题3.3:内存中的情况如右图,写出下 面指令执行后寄存器ax,bx,cx中的值 。3.3 字的传送3.4 mov、add、sub指令v已学mov指令的几种形式:mov 寄存器,数据mov 寄存器,寄存器mov 寄存器,内存单元mov 内存单元,寄存器mov 段寄存器,寄存器vadd和sub指令同mov一样,都有两个 操作对象。v它们可以对段寄存器进行操作吗?3.4

6、mov、add、sub指令3.5 数据段v前面讲过,对于8086PC机,我们可以根 据需要将一组内存单元定义为一个段。 v我们可以将一组长度为N(N64K)、地 址连续、起始地址为16的倍数的内存单元 当作专门存储数据的内存空间,从而定义了 一个数据段。 v比如我们用123B0H123B9H这段空间 来存放数据: 段地址:123BH 长度:10字节3.5 数据段v如何访问数据段中的数据呢? v将一段内存当作数据段,是我们在编程时的 一种安排,我们可以在具体操作的时候 ,用 ds 存放数据段的段地址,再根据需要,用相 关指令访问数据段中的具体单元。 v示例3.5 数据段v我们将123B0H123

7、BAH的内存单元定义 为数据段,我们现在要累加这个数据段中的前 3个单元中的数据,代码如下:3.5 数据段v问题3.5 v写几条指令,累加数据段中的前3个字型数 据。v思考后看分析。问题3.5分析v注意:一个字型数据占两个单元,所以偏移 地址是0、2、4。3.1节3.5节 小结v (1)字在内存中存储时 ,要用两个地址连续的内 存单元来存放,字的低位字节存放在低地址单元中 ,高位字节存放再高地址单元中。 v (2)用 mov 指令要访问内存单元,可以在mov 指令中只给出单元的偏移地址,此时,段地址默认 在DS寄存器中。 v (3)address表示一个偏移地址为address的 内存单元。3

8、.1节3.5节 小结(续)v(4)在内存和寄存器之间传送字型数据时 ,高地址单元和高8位寄存器、低地址单元 和低8位寄存器相对应。 v(5)mov、add、sub是具有两个操作对 象的指令。jmp是具有一个操作对象的指令 。3.6 栈v我们研究栈的角度:栈是一种具有特殊的访问方式的存储空间 。它的特殊性就在于,最后进入这个空间 的数据,最先出去。 v可以用一个盒子和3本书来描述栈的操作方式3.6 栈v栈有两个基本的操作:入栈和出栈。 入栈:将一个新的元素放到栈顶; 出栈:从栈顶取出一个元素。 v栈顶的元素总是最后入栈,需要出栈时,又最先 被从栈中取出。 v栈的操作规则:LIFO (Last I

9、n First Out,后进先出)3.7 CPU提供的栈机制v8086CPU提供相关的指令来以栈的方式 访问内存空间。 v这意味着,我们在基于8086CPU编程的 时候,可以将一段内存当作栈来使用。3.7 CPU提供的栈机制v8086CPU提供入栈和出栈指令: (最 基本的)PUSH(入栈)POP (出栈)push ax:将寄存器ax中的数据送入栈 中;pop ax :从栈顶取出数据送入ax。 v8086CPU的入栈和出栈操作都是以字为 单位进行的。3.6 栈v 下面举例说明,我们可以将10000H1000FH这段内 存当作栈来使用。 v 下面一段指令的执行过程:mov ax,0123Hpus

10、h axmov bx,2266Hpush bxmov cx,1122Hpush cxpop axpop bxpop cx3.6 栈v指令序列的执行过程演示 v注意:字型数据用两个单元存放,高地址单 元放高 8 位,低地址单元放低8 位。 v是否有疑惑?两个疑问 两个疑问v1、CPU如何知道一段内存空间被当作栈 使用? v2、执行push和pop的时候,如何知道哪 个单元是栈顶单元? v分析结论:任意时刻,SS:SP指向栈顶元素。对于两个疑问的分析回想:CPU如何指导当前要执行的指令所在的位置?寄存器CS和IP中存放着当前指令的段地址和偏移地 址。8086CPU中,有两个寄存器: 段寄存器SS

11、存放栈顶的段地址 寄存器SP 存放栈顶的偏移地址任意时刻,SS:SP指向栈顶元素。push 指令的执行过程vpush ax (1)SP=SP2; (2)将ax中的内容送入SS:SP指向的内 存单元处,SS:SP此时指向新栈顶。 图示push 指令的执行过程3.6 栈v问题3.6:如果我们将10000H1000FH 这段空间当作栈,初始状态栈是空的,此时, SS=1000H,SP=?v思考后看分析。问题3.6分析vSP = 0010Hpop 指令的执行过程vpop ax (1)将SS:SP指向的内存单元处的数据 送入ax中; (2)SP = SP+2,SS:SP指向当前栈顶 下面的单元,以当前栈

12、顶下面的单元为新 的栈顶。 图示pop 指令的执行过程v注意pop 指令的执行过程v注意: 出栈后,SS:SP指向新的栈顶 1000EH, pop操作前的栈顶元素,1000CH 处的 2266H 依然存在 ,但是,它已不在栈中。 当再次执行push等入栈指令后,SS:SP移 至1000CH,并在里面写入新的数据,它 将被覆盖。3.8 栈顶超界的问题vSS和SP只记录了栈顶的地址,依靠SS和 SP可以保证在入栈和出栈时找到栈顶。v可是,如何能够保证在入栈、出栈时,栈顶 不会超出栈空间?3.8 栈顶超界的问题v栈顶超界是危险的:因为我们既然将一段空间安排为栈 ,那么在 栈空间之外的空间里很可能存放

13、了具有其他 用途的数据、代码等,这些数据、代码可能 是我们自己的程序中的,也可能是别的程序 中的。3.8 栈顶超界的问题v但是由于我们在入栈出栈时的不小心,而将 这些数据、代码意外地改写,将会引发一连 串的错误。 v我们当然希望CPU 可以帮我们解决这个问 题,3.8 栈顶超界的问题v 比如说在CPU中有记录栈顶上限和下限的寄存器, 我们可以通过填写这些寄存器来指定栈空间的范围 ,然后 ,CPU 在执行push指令的时候靠检测栈 顶上限寄存器,在执行pop 指令的时候靠检测栈顶 下限寄存器保证不会超界。 v 实际情况:8086CPU中并没有这样的寄存器。 v 8086CPU不保证对栈的操作不会

14、超界。这就是说, 8086CPU 只知道栈顶在何处(由 SS:SP指示),而不知道读者安排的栈空间有多大 。3.8 栈顶超界的问题v结论:我们在编程的时候要自己操心栈顶超界 的问题 ,要根据可能用到的最大栈空 间,来安排栈的大小,防止入栈的数据 太多而导致的超界;执行出栈操作的时 候也要注意,以防栈空的时候继续出栈 而导致的超界。3.9 push、pop指令v push和pop指令是可以在寄存器和内存 之间传送数据的。vpush和pop指令的格式栈与内存v栈空间当然也是内存空间的一部分,它只是 一段可以以一种特殊的方式进行访问的内存 空间。3.9 push、pop指令vpush和pop指令的格

15、式(1) push 寄存器:将一个寄存器中的数据入 栈 pop 寄存器:出栈,用一个寄存器接收 出栈的数据v例如:push axpop bx3.9 push、pop指令vpush和pop指令的格式(2) push 段寄存器:将一个段寄存器中的数 据入栈 pop 段寄存器:出栈,用一个段寄存器 接收出栈的数据v例如:push dspop es3.9 push、pop指令v push和pop指令的格式(3) push 内存单元:将一个内存单元处的字入栈 (栈操作都是以字为单位) pop 内存单元:出栈,用一个内存字单元接 收出栈的数据v 例如:push 0pop 23.9 push、pop指令v问

16、题3.7编程:将10000H1000FH 这段空间当作栈, 初始状态是空的,将 AX、BX、DS中的数据 入栈。v思考后看分析。问题3.7分析3.9 push、pop指令v问题3.8编程: (1)将10000H1000FH 这段空间当作栈, 初始状态是空的; (2)设置AX=001AH,BX=001BH; (3)将AX、BX中的数据入栈; (4)然后将AX、BX清零; (5)从栈中恢复AX、BX原来的内容。 v思考后看分析。问题3.8分析v结论问题3.8分析v从上面的程序我们看到,用栈来暂存以后需 要恢复的寄存器中的内容时 ,出栈的顺序要 和入栈的顺序相反,因为最后入栈的寄存器 的内容在栈顶 ,所以在恢复时,要最先出栈 。3.9 push、pop指令v问题3.9编程:(1)将10000H1000FH 这段空间当作 栈,初始状态

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号