您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 软件工程 > [汇编语言(第二版)][王爽著][课件]第3章寄存器(内存访问)
《汇编语言》课件王爽著-清华大学出版社制作工具: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]从哪个内存单元送到哪个寄存器中呢?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指向栈顶元素。本课件由汇编网()制作提供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
本文标题:[汇编语言(第二版)][王爽著][课件]第3章寄存器(内存访问)
链接地址:https://www.777doc.com/doc-2860671 .html