收藏 分销(赏)

汇编语言讲稿03.pptx

上传人:人****来 文档编号:4265755 上传时间:2024-09-02 格式:PPTX 页数:69 大小:646.40KB 下载积分:14 金币
下载 相关 举报
汇编语言讲稿03.pptx_第1页
第1页 / 共69页
汇编语言讲稿03.pptx_第2页
第2页 / 共69页


点击查看更多>>
资源描述
LOGO汇编语言汇编语言汇编语言汇编语言课件课件课件课件第第第第3 3 章寄存器(内存访问)章寄存器(内存访问)章寄存器(内存访问)章寄存器(内存访问)v3.1 内存中字的存储内存中字的存储v3.2 DS和和addressv3.3 字的传送字的传送v3.4 mov、add、sub指令指令v3.5 数据段数据段v3.6 栈栈v3.7 CPU提供的栈机制提供的栈机制v3.8 栈顶超界的问题栈顶超界的问题v3.9 push、pop指令指令v3.10 栈段栈段引言引言引言引言v在第在第2章中,我们主要从章中,我们主要从 CPU 如何执行如何执行指令的角度讲解了指令的角度讲解了8086CPU的逻辑结构、的逻辑结构、形成物理地址的方法、相关的寄存器以及形成物理地址的方法、相关的寄存器以及一些指令。一些指令。v这一章中,我们从访问内存的角度继续学这一章中,我们从访问内存的角度继续学习几个寄存器。习几个寄存器。v在在0地址处开始存放地址处开始存放20000(4E20H)v0号单元是低地址单元,号单元是低地址单元,1号单元是高地址单元。号单元是高地址单元。3.1 3.1 内存中字的存储内存中字的存储内存中字的存储内存中字的存储3.1 3.1 内存中字的存储内存中字的存储内存中字的存储内存中字的存储v问题:问题:(1)0地址单元中存放的字节型数据是多少?(2)0地址字单元中存放的字型数据是多少?(3)2地址字单元中存放的字节型数据是多少?3.1 3.1 内存中字的存储内存中字的存储内存中字的存储内存中字的存储v问题:问题:(4)2地址单元中存放的字型数据是多少?(5)1地址字单元中存放的字型数据是多少?v结论结论3.1 3.1 内存中字的存储内存中字的存储内存中字的存储内存中字的存储v结论:结论:任何两个地址连续的内存单元,N号单元和 N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。3.2 DS3.2 DS和和和和addressaddressvCPU要读取一个内存单元的时候,必须先要读取一个内存单元的时候,必须先给出这个内存单元的地址;给出这个内存单元的地址;v在在8086PC中,内存地址由段地址和偏移中,内存地址由段地址和偏移地址组成。地址组成。v8086CPU中有一个中有一个 DS寄存器,通常用寄存器,通常用来存放要访问的数据的段地址。来存放要访问的数据的段地址。v例如例如3.2 DS3.2 DS和和和和addressaddressv例如:我们要读取例如:我们要读取10000H单元的内容,单元的内容,送入寄存器送入寄存器al中。中。3.2 DS3.2 DS和和和和addressaddress已知的已知的mov指令可完成的两种传送功能:指令可完成的两种传送功能:(1)将数据直接送入寄存器;)将数据直接送入寄存器;(2)将一个寄存器中的内容送入另一个寄存器中。)将一个寄存器中的内容送入另一个寄存器中。mov 指令指令 还可以将一个内存单元中的内容送入还可以将一个内存单元中的内容送入一个寄存器。一个寄存器。3.2 DS3.2 DS和和和和addressaddressv从哪个内存单元送到哪个寄存器中呢?从哪个内存单元送到哪个寄存器中呢?vmov指令的格式:指令的格式:mov 寄存器名,寄存器名,偏移地址偏移地址3.2 DS3.2 DS和和和和addressaddressv执行指令时,执行指令时,8086CPU自动取自动取DS中的数中的数据为内存单元的段地址。据为内存单元的段地址。v如何把如何把1000H送入送入ds?传送指令 mov ds,1000H?8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。mov ds,1000H 是非法的。数据一般的寄存器段寄存器v正确:正确:mov bx,1000H mov ds,bx错误3.2 DS3.2 DS和和和和addressaddress下面三条指令将下面三条指令将10000H(1000:0)中的)中的数据读到数据读到al中。中。mov bx,1000Hmov ds,bxmov al,03.2 DS3.2 DS和和和和addressaddressv问题:问题:写几条指令,将al中的数据送入内存单元10000H?(思考后分析)v分析问题本质:分析问题本质:怎样将数据从寄存器送入内存单元?v结论:结论:mov bx,1000H mov ds,bx mov 0,al3.3 3.3 字的传送字的传送字的传送字的传送v因为因为8086CPU是是16位结构,有位结构,有16根数根数据线,所以,可以一次性传送据线,所以,可以一次性传送16位的数据,位的数据,也就是一次性传送一个字。也就是一次性传送一个字。v问题问题3.3:内存中的情况如右图,写出下:内存中的情况如右图,写出下面指令执行后寄存器面指令执行后寄存器ax,bx,cx中的值。中的值。3.3 3.3 字的传送字的传送字的传送字的传送3.4 mov3.4 mov、addadd、subsub指令指令指令指令v已学已学mov指令的几种形式:指令的几种形式:mov 寄存器,数据寄存器,数据 mov 寄存器,寄存器寄存器,寄存器 mov 寄存器,内存单元寄存器,内存单元 mov 内存单元,寄存器内存单元,寄存器 mov 段寄存器,寄存器段寄存器,寄存器vadd和和sub指令同指令同mov一样,都有两个一样,都有两个操作对象。操作对象。v它们可以对段寄存器进行操作吗?它们可以对段寄存器进行操作吗?3.4 mov3.4 mov、addadd、subsub指令指令指令指令3.5 3.5 数据段数据段数据段数据段v前面讲过,对于前面讲过,对于8086PC机,我们可以根机,我们可以根据需要将一组内存单元定义为一个段。据需要将一组内存单元定义为一个段。v我们可以将一组长度为我们可以将一组长度为N(N64K)、地)、地址连续、起始地址为址连续、起始地址为16的倍数的内存单元的倍数的内存单元当作专门存储数据的内存空间,从而定义了当作专门存储数据的内存空间,从而定义了一个数据段。一个数据段。v比如我们用比如我们用123B0H123B9H这段空间这段空间来存放数据:来存放数据:段地址:123BH长度:10字节3.5 3.5 数据段数据段数据段数据段v如何访问数据段中的数据呢?如何访问数据段中的数据呢?v将一段内存当作数据段,是我们在编程时的一将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候种安排,我们可以在具体操作的时候,用,用 ds 存放数据段的段地址,再根据需要,用相存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。关指令访问数据段中的具体单元。v示例示例3.5 3.5 数据段数据段数据段数据段v我们将我们将123B0H123BAH的内存单元定义的内存单元定义为数据段,我们现在要累加这个数据段中的前为数据段,我们现在要累加这个数据段中的前3个单元中的数据,代码如下:个单元中的数据,代码如下:3.5 3.5 数据段数据段数据段数据段v问题问题3.5v写几条指令,累加数据段中的前写几条指令,累加数据段中的前3个字型数个字型数据。据。v思考后看思考后看分析分析。问题问题问题问题3.53.5分析分析分析分析v注意:一个字型数据占两个单元,所以偏移注意:一个字型数据占两个单元,所以偏移地址是地址是0、2、4。3.13.1节节节节3.53.5节节节节 小结小结小结小结v(1)字在内存中存储时)字在内存中存储时,要用两个地址连续的内,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,存单元来存放,字的低位字节存放在低地址单元中,高位字节存放再高地址单元中。高位字节存放再高地址单元中。v(2)用)用 mov 指令要访问内存单元,可以在指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认指令中只给出单元的偏移地址,此时,段地址默认在在DS寄存器中。寄存器中。v(3)address表示一个偏移地址为表示一个偏移地址为address的的内存单元。内存单元。3.13.1节节节节3.53.5节节节节 小结(续)小结(续)小结(续)小结(续)v(4)在内存和寄存器之间传送字型数据时,)在内存和寄存器之间传送字型数据时,高地址单元和高高地址单元和高8位寄存器、低地址单元和位寄存器、低地址单元和低低8位寄存器相对应。位寄存器相对应。v(5)mov、add、sub是具有两个操作对是具有两个操作对象的指令。象的指令。jmp是具有一个操作对象的指令。是具有一个操作对象的指令。3.6 3.6 栈栈栈栈v我们研究栈的角度:我们研究栈的角度:栈是一种具有特殊的访问方式的存储空间。栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的它的特殊性就在于,最后进入这个空间的数据,最先出去。数据,最先出去。v可以用一个盒子和可以用一个盒子和3本书来描述本书来描述 栈的操作方式栈的操作方式3.6 3.6 栈栈栈栈v栈有两个基本的操作:入栈和出栈。栈有两个基本的操作:入栈和出栈。入栈:将一个新的元素放到栈顶;出栈:从栈顶取出一个元素。v栈顶的元素总是最后入栈,需要出栈时,又最先栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。被从栈中取出。v栈的操作规则:栈的操作规则:LIFO(Last In First Out,后进先出),后进先出)3.7 CPU3.7 CPU提供的栈机制提供的栈机制提供的栈机制提供的栈机制v8086CPU提供相关的指令来以栈的方式提供相关的指令来以栈的方式访问内存空间。访问内存空间。v这意味着,我们在基于这意味着,我们在基于8086CPU编程的编程的时候,可以将一段内存当作栈来使用。时候,可以将一段内存当作栈来使用。3.7 CPU3.7 CPU提供的栈机制提供的栈机制提供的栈机制提供的栈机制v8086CPU提供入栈和出栈指令:提供入栈和出栈指令:(最(最基本的)基本的)PUSH(入栈)(入栈)POP (出栈)(出栈)push ax:将寄存器:将寄存器ax中的数据送入栈中的数据送入栈中;中;pop ax:从栈顶取出数据送入:从栈顶取出数据送入ax。v8086CPU的入栈和出栈操作都是以字为的入栈和出栈操作都是以字为单位进行的。单位进行的。3.6 3.6 栈栈栈栈v下面举例说明,我们可以将下面举例说明,我们可以将10000H1000FH这段内这段内存当作栈来使用。存当作栈来使用。v下面一段指令的执行过程:下面一段指令的执行过程:mov ax,0123H push ax mov bx,2266H push bx mov cx,1122H push cx pop ax pop bx pop cx3.6 3.6 栈栈栈栈v指令序列的执行过程演示指令序列的执行过程演示v注意:字型数据用两个单元存放,高地址单注意:字型数据用两个单元存放,高地址单元放高元放高 8 位,低地址单元放低位,低地址单元放低8 位。位。v是否有疑惑?是否有疑惑?两个疑问两个疑问 两个疑问两个疑问两个疑问两个疑问v1、CPU如何知道一段内存空间被当作栈如何知道一段内存空间被当作栈使用?使用?v2、执行、执行push和和pop的时候,如何知道哪的时候,如何知道哪个单元是栈顶单元?个单元是栈顶单元?v分析分析 结论:结论:任意时刻,任意时刻,SS:SP指向栈顶元素。指向栈顶元素。push push 指令的执行过程指令的执行过程指令的执行过程指令的执行过程vpush ax(1)SP=SP2;(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。图示push push 指令的执行过程指令的执行过程指令的执行过程指令的执行过程3.6 3.6 栈栈栈栈v问题问题3.6:如果我们将:如果我们将10000H1000FH 这段空间当作栈,初始状态栈是空的,此时,这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=?v思考后看思考后看分析分析。问题问题问题问题3.63.6分析分析分析分析vSP=0010Hpop pop 指令的执行过程指令的执行过程指令的执行过程指令的执行过程vpop ax(1)将SS:SP指向的内存单元处的数据送入ax中;(2)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。图示pop pop 指令的执行过程指令的执行过程指令的执行过程指令的执行过程v注意注意pop pop 指令的执行过程指令的执行过程指令的执行过程指令的执行过程v注意:注意:出栈后,SS:SP指向新的栈顶 1000EH,pop操作前的栈顶元素,1000CH 处的2266H 依然存在,但是,它已不在栈中。当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。3.8 3.8 栈顶超界的问题栈顶超界的问题栈顶超界的问题栈顶超界的问题vSS和和SP只记录了栈顶的地址,依靠只记录了栈顶的地址,依靠SS和和SP可以保证在入栈和出栈时找到栈顶。可以保证在入栈和出栈时找到栈顶。v可是,如何能够保证在入栈、出栈时,栈顶可是,如何能够保证在入栈、出栈时,栈顶不会超出栈空间?不会超出栈空间?3.8 3.8 栈顶超界的问题栈顶超界的问题栈顶超界的问题栈顶超界的问题v栈顶超界是危险的:栈顶超界是危险的:因为我们既然将一段空间安排为栈因为我们既然将一段空间安排为栈,那么在,那么在栈空间之外的空间里很可能存放了具有其他栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,这些数据、代码可能用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序是我们自己的程序中的,也可能是别的程序中的。中的。3.8 3.8 栈顶超界的问题栈顶超界的问题栈顶超界的问题栈顶超界的问题v但是由于我们在入栈出栈时的不小心,而将但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连这些数据、代码意外地改写,将会引发一连串的错误。串的错误。v我们当然希望我们当然希望CPU 可以帮我们解决这个问可以帮我们解决这个问题,题,3.8 3.8 栈顶超界的问题栈顶超界的问题栈顶超界的问题栈顶超界的问题v比如说在比如说在CPU中有记录栈顶上限和下限的寄存器,中有记录栈顶上限和下限的寄存器,我们可以通过填写这些寄存器来指定栈空间的范围我们可以通过填写这些寄存器来指定栈空间的范围,然后,然后,CPU 在执行在执行push指令的时候靠检测栈指令的时候靠检测栈顶上限寄存器,在执行顶上限寄存器,在执行pop 指令的时候靠检测栈顶指令的时候靠检测栈顶下限寄存器保证不会超界。下限寄存器保证不会超界。v实际情况:实际情况:8086CPU中并没有这样的寄存器。中并没有这样的寄存器。v8086CPU不保证对栈的操作不会超界。不保证对栈的操作不会超界。这就是说,这就是说,8086CPU 只知道栈顶在何处(由只知道栈顶在何处(由SS:SP指示),而不知道读者安排的栈空间有多大。指示),而不知道读者安排的栈空间有多大。3.8 3.8 栈顶超界的问题栈顶超界的问题栈顶超界的问题栈顶超界的问题v结论:结论:我们在编程的时候要自己操心栈顶超界我们在编程的时候要自己操心栈顶超界的问题的问题,要根据可能用到的最大栈空,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈候也要注意,以防栈空的时候继续出栈而导致的超界。而导致的超界。3.9 push3.9 push、poppop指令指令指令指令v push和和pop指令是可以在寄存器和指令是可以在寄存器和内存内存之间传送数据的。之间传送数据的。vpush和和pop指令的格式指令的格式3.9 push3.9 push、poppop指令指令指令指令vpush和和pop指令的格式(指令的格式(1)push 寄存器:将一个寄存器中的数据入栈pop 寄存器:出栈,用一个寄存器接收出栈的数据v例如:例如:push ax pop bx3.9 push3.9 push、poppop指令指令指令指令vpush和和pop指令的格式(指令的格式(2)push 段寄存器:将一个段寄存器中的数据入栈pop 段寄存器:出栈,用一个段寄存器接收出栈的数据v例如:例如:push ds pop es3.9 push3.9 push、poppop指令指令指令指令vpush和和pop指令的格式(指令的格式(3)push 内存单元:将一个内存单元处的字入栈内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)(栈操作都是以字为单位)pop 内存单元:出栈,用一个内存字单元接内存单元:出栈,用一个内存字单元接收出栈的数据收出栈的数据v例如:例如:push 0 pop 23.9 push3.9 push、poppop指令指令指令指令v问题问题3.7 编程:编程:将将10000H1000FH 这段空间当作栈,这段空间当作栈,初始状态是空的,将初始状态是空的,将 AX、BX、DS中的数据中的数据入栈。入栈。v思考后看思考后看分析分析。问题问题问题问题3.73.7分析分析分析分析3.9 push3.9 push、poppop指令指令指令指令v问题问题3.8 编程:编程:(1)将10000H1000FH 这段空间当作栈,初始状态是空的;(2)设置AX=001AH,BX=001BH;(3)将AX、BX中的数据入栈;(4)然后将AX、BX清零;(5)从栈中恢复AX、BX原来的内容。v思考后看思考后看分析分析。问题问题问题问题3.83.8分析分析分析分析v结论结论问题问题问题问题3.83.8分析分析分析分析v从上面的程序我们看到,用栈来暂存以后需从上面的程序我们看到,用栈来暂存以后需要恢复的寄存器中的内容时要恢复的寄存器中的内容时,出栈的顺序要,出栈的顺序要和入栈的顺序相反,因为最后入栈的寄存器和入栈的顺序相反,因为最后入栈的寄存器的内容在栈顶的内容在栈顶,所以在恢复时,要最先出栈。,所以在恢复时,要最先出栈。3.9 push3.9 push、poppop指令指令指令指令v问题问题3.9 编程:编程:(1)将)将10000H1000FH 这段空间当作这段空间当作栈,初始状态是空的;栈,初始状态是空的;(2)设置)设置AX=002AH,BX=002BH;(3)利用栈)利用栈,交换,交换 AX 和和 BX 中的数据。中的数据。v思考后看思考后看分析分析。问题问题问题问题3.93.9分析分析分析分析3.9 push3.9 push、poppop指令指令指令指令v问题问题3.10v我们如果要在我们如果要在10000H处写入字型数据处写入字型数据2266H,可以用,可以用以下的代码完成:以下的代码完成:mov ax,1000H mov ds,ax mov,ax,2266H mov 0,axv补全下面的代码补全下面的代码3.9 push3.9 push、poppop指令指令指令指令v补全下面的代码,完成同样的功能:补全下面的代码,完成同样的功能:在在10000H处写入字型数据处写入字型数据2266H。_ _ _ mov ax,2266H push axv要求:不能使用要求:不能使用“mov 内存单元内存单元,寄存器寄存器”这类指令这类指令v思考后看思考后看分析分析。问题问题问题问题3.103.10分析分析分析分析v我们看需补全代码的最后两条指令,将我们看需补全代码的最后两条指令,将ax中的中的2266H压入栈中,也就是说,最终应由压入栈中,也就是说,最终应由push ax将将2266H写入写入10000H处。处。v问题的关键就在于:如何使问题的关键就在于:如何使push ax访问的内存访问的内存单元是单元是10000H。vPush指令是入栈指令。(注意执行过程)指令是入栈指令。(注意执行过程)v完成程序完成程序问题问题问题问题3.103.10分析(续)分析(续)分析(续)分析(续)v完成的程序:完成的程序:mov ax,1000H mov ss,ax mov sp,2 mov ax,2266H push axv结论结论3.10 3.10 栈段栈段栈段栈段v将一段内存当作栈段,仅仅是我们在编程时的将一段内存当作栈段,仅仅是我们在编程时的一种安排,一种安排,CPU 并不会由于这种安排,就在并不会由于这种安排,就在执行执行push、pop 等栈操作指令时就自动地等栈操作指令时就自动地将我们定义的栈段当作栈空间来访问。将我们定义的栈段当作栈空间来访问。v如何使的如如何使的如push、pop 等栈操作指令访问等栈操作指令访问我们定义的栈段呢?我们定义的栈段呢?将将SS:SP指向我们定义的栈段。指向我们定义的栈段。3.10 3.10 栈段栈段栈段栈段v比如我们将比如我们将10010H1001FH 这段长这段长度为度为 16 字节的内存空间当作栈来用,以字节的内存空间当作栈来用,以栈的方式进行访问。栈的方式进行访问。v这段空间就可以成为栈段,段地址为这段空间就可以成为栈段,段地址为1000H,大小为,大小为16字节。字节。3.10 3.10 栈段栈段栈段栈段v问题问题3.11v如果我们将如果我们将10000H1FFFFH这段空间这段空间当作栈段,初始状态是空的,此时,当作栈段,初始状态是空的,此时,SS=1000H,SP=?v思考后看思考后看分析分析。问题问题问题问题3.113.11分析分析分析分析v我们将我们将10000H1FFFFH这段空间当作这段空间当作栈段栈段,SS=1000H,栈空间大小为,栈空间大小为64KB,栈最底部的字单元地址为,栈最底部的字单元地址为1000:FFFE。v任意时刻,任意时刻,SS:SP指向栈顶,当栈中只有一指向栈顶,当栈中只有一个元素的时候,个元素的时候,SS=1000H,SP=FFFEH。问题问题问题问题3.113.11分析分析分析分析v栈为空,就相当于栈中唯一的元素出栈,出栈后,栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2。vSP原来为原来为FFFEH,加,加2后后SP=0,所以,当栈,所以,当栈为空的时候,为空的时候,SS=1000H,SP=0。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服