欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    小甲鱼汇编课件.docx

    • 资源ID:946789       资源大小:54.37KB        全文页数:31页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    小甲鱼汇编课件.docx

    引言汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。在本章中,对硬件系统结构的问题进行一局部的探讨,以使后续的课程可在一个好的根底上进行。当课程进行到需要补充新的根底知识关于编程结构或其他的时候,再对相关的根底知识进行介绍和探讨。本书的原那么是,以后用到的知识,以后再说。汇编课程的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活的控制系统进行工作。机器语言机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。指令:oio100oo(pushax)电平脉冲:电子脉冲例如图早期的程序员们将0、1数字编程的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。后来呢,逐渐使用高科技但打洞洞是始祖S=768+12288-1280汇编语言的产生汇编语言的主体是汇编指令汇编指令和机器指令的差异在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。汇编指令是机器指令的助记符。操作:存放器BX的内容送到AX中汇编指令:MOVAX,BX这样的写法与人类语言接近,便于阅读和记忆。存放器:简单的讲是CPU中可以存储数据的器件,一个CPU中有多个存放器。AX是其中一个存放器的代号,BX是另一个存放器的代号。更详细的内容我们在以后的课程中将会讲到。计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢?汇编语言的组成汇编语言由以下3类组成:1、汇编指令机器码的助记符2、伪指令由编译器执行3、其它符号由编译器识别汇编语言的核心是汇编指令,它决定了汇编语言的特性。存储器CPU是计算机的核心部件.它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向它提供指令和数据。指令和数据在存储器中存放,也就是平时所说的内存。在一台PC机中内存的作用仅次于CPU.离开了内存,性能再好的CPU也无法工作。磁盘不同于内存,磁盘上的数据或程序如果不读到内存中,就无法被CPU使用。指令和数据指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。二进制信息:->89D8H数据->MOVAX,BX程序存储单元存储器被划分为假设干个存储单元,每个存储单元从0开始顺序编号;例如:一个存储器有128个存储单元,编号从0127。存储器对于大容量的存储器一般还用以下单位来计量容量以下用B来代表Byte:1KB=1O24B1MB=1O24KB1GB=1O24MB1TB=1O24GB磁盘的容量单位同内存的一样,实际上以上单位是微机中常用的计量单位。CPU对存储器的读写CPU要想进行数据的读写,必须和外部器件标准的说法是芯片进行三类信息的交互:存储单元的地址地址信息器件的选择,读或写命令控制信息读或写的数据数据信息那么CPU是通过什么将地址、数据和控制信息传到存储芯片中的呢?电子计算机能处理、传输的信息都是电信号,电信号当然要用导线传送。在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。物理上:一根根导线的集合;逻辑上划分为:地址总线数据总线控制总线总线在逻辑上划分的图示:上节课我们知道CPU是如何进行数据读写的。可是我们如何命令计算机进行数据的读写呢?对于8086CPU,下面的机器码能够完成从3号单元读数据:含义:从3号单元读取数据送入存放器AXCPU接收这条机器码后将完成上面所述的读写工作。地址总线CPU是通过地址总线来指定存储单元的。地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。那么,地址总线如何发送地址信息呢?地址总线一个CPU有N根地址总线,那么可以说这个CPU的地址总线的宽度为Ne这样的CPU最多可以寻找2的N次方个内存单元。CPU与内存或其它器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。我们来分别看一下它们向内存中写入数据89D8H时,是如何通过数据总线传送数据的:8位数据总线上传送的信息8位数据总线上传送的信息16位数据总线上传送的信息16位数据总线上传送的信息控制总线CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。控制总线上发送的控制信息控制总线上发送的控制信息前面所讲的内存读或写命令是由几根控制线综合发出的:其中有一根名为读信号输出控制线负责由CPU向夕M专送读信号,CPU向该控制线上输出低电平表示将要读取数据;有一根名为写信号输出控制线负责由CPU向外传送写信号。小结1汇编指令是机器指令的助记符,同机器指令一对应。(2)每一种CPU都有自己的汇编指令集。(3)CPU可以直接使用的信息在存储器中存放。4在存储器中指令和数据没有任何区别,都是二进制信息。(5)存储单元从零开始顺序编号。(6) 一个存储单元可以存储8个bit用作单位写成"b/,即8位二进制数。(7) IB=8bIKB=1024BIMB=1024KBIGB=1024MB(8)每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个CPU可以引出三种总线的宽度标志了这个CPU的不同方面的性能:地址总线的宽度决定了CPU的寻址能力;数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量;控制总线宽度决定了CPU对系统中其它器件的控制能力。在汇编课程中,我们从功能的角度介绍了这三类总线,对实际的连接情况不做讨论。内存地址空间概述J什么是内存地址空间呢?一个CPU的地址线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。下面深入讨论。首先需要介绍两局部根本知识,主板和接口卡。主板在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件。这些器件通过总线地址总线、数据总线、控制总线相连。接口卡计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。CPU对外部设备不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。各类存储器芯片从读写属性上看分为两类:随机存储器RAM和只读存储器(ROM)从功能和连接上分类:随机存储器RAM接口卡上的RAM装有BIOS的ROMBIOS:BasicInput/OutputSystem,根本输入输出系统。BIOS是由主板和各类接口卡如:显卡、网卡等厂商提供的软件系统,可以通过它利用该硬件设备进行最根本的输入输出。在主板和某些接口卡上插有存储相应BIOS的ROM0PC机中各类存储器的逻辑连接情况内存地址空间上述的那些存储器在物理上是独立的器件。但是它们在以下两点上相同:1、都和CPU的总线相连。2、CPU对它们进行读或写的时候都通过控制线发出内存读写命令。将各各类存储器看作一个逻辑存储器:将各各类存储器看作一个逻辑存储器假设,上图中的内存空间地址段分配如下:地址07FFFH的32KB空间为主随机存储器的地址空间;地址8000H9FFFH的8KB空间为显存地址空间;Waoooh-FFFFh的24kb空间为各个rom的地址空间。所有的物理存储器被看作一个由假设干存储单元组成的逻辑存储器;每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间;CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。不同的计算机系统的内存地址空间分配情况是不同的。8086PC机的内存地址空间分配8086PC机的内存地址空间分配最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU角度考虑问题。(我们学习这门课程的核心思维)对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。CPU概述一个典型的CPU由运算器、控制器、存放器等器件组成,这些器件靠内部总线相连。区别:内部总线实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其它器件的联系。存放器概述8086CPU有14个存放器它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CSsSS、DS、ES、PSW9这些存放器我们以后会陆续介绍,因为"以后用到的知识以后再讲减负.通用存放器8086CPU所有的存放器都是16位的,可以存放两个字节。AX、BX、CX.DX通常用来存放一般性数据被称为通用存放器。下面以AX为例,我们看一下存放器的逻辑结构。存放器的逻辑结构一个16位存放器可以存储一个16位的数据。数据的存放情况数据:18二进制表示:100lO在存放器AX中的存储:存放器AX数据:20000在存放器AX中的存储:存放器AX一个16位存放器所能存储的数据的最大值为多少?答案:216-lo8086上T弋CPU中的存放器都是8位的,为保证兼容性,这四个存放器都可以分为两个独立的8位存放器使用。AX可以分为AH和AL;BX可以分为BH和BL;CX可以分为CH和CL;DX可以分为DH和DL08086CPU的8位存放器存储逻辑以AX为例,8086CPU的16位存放器分为两个8位存放器的情况:8086CPU的16位存放器AX的氐8位0位7位构成了AL存放器,高8位8位15位构成了AH存放器。AH和AL存放器是可以独立使用的8位存放器。8086CPU的8位存放器数据存储情况8086CPU的8位存放器数据存储情况8086CPU的8位存放器数据存储情况一个8位存放器所能存储的数据的最大值是多少?答案:28-lo字在存放器中的存储一个字可以存在一个16位存放器中,这个字的高位字节和低位字节自然就存在这个存放器的高8位存放器和低8位存放器中。字在存放器中的存储关于数制的讨论由于一个内存单元可以存放8位数据,CPU中的存放器又可存放n个8位数据。也就是说,计算机中的数据大多是由1N个8位数据构成的。用十六进制来表示数据可以直观的看出这个数据是由哪些8位数据构成的。每两位对应一个八位的二进制数据修正视频!几条汇编指令汇编指令CPU执行下表中的程序段的每条指令后,对存放器中的数据进行的改变。汇编指令汇编指令物理地址CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。我们将这个唯一的地址称为物理地址。16位结构的CPU概括的讲,16位结构描述了一个CPU具有以下几个方面特征:1.运箕器一次最多可以处理16位的数据。2、存放器的最大宽度为16位。3、存放器和运箕器之间的通路是16位的。8086CPU给出物理地址的方法8086有20位地址总线,可传送20位地址,寻址能力为1M。8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。问题:那么,8086CPU如何用内部16位的数据转换成20位的地址呢?自问自答:8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址8086CPU如何用内部16位的数据转换成20位的地址8086CPU读写内存时,发生了这么一些事:CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;地址加法器将两个16位地址合并成一个20位的地址;地址加法器工作原理地址加法器合成物理地址的方法:物理地址二段地址X16+偏移地址例如:8086CPU访问地址为123C8H的内存单元8086CPU访问地址为123C8H的内存单元由段地址X16引发的血案"段地址X16"有一个更为常用的说法就是数据左移4位。二进制位进制转换我们通过观察移位次数和各种形式数据的关系:一个数据的二进制形式左移1位,相当于该数据乘以2;一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;地址加法器如何完成段地址X16的运算?没错,以二进制形式存放的段地址左移4位。一个馒头引发的分析经过进一步的思考,我们可以看出:一个数据的十六进制形式左移1位,相当于乘以16;一个数据的十进制形式左移1位,相当于乘以10;一个数据的X进制形式左移1位,相当于乘以X。段地址l6+偏移地址=物理地址”的本质含义两个比喻说明:说明“根底地址+偏移地址=物理地址”的思想:第一个比喻比方说,学校、体育馆同在一条笔直的单行路上学校位于路的起点O米处读者在学校,要去图书馆,问我那里的地址,我可以用几种方式描述这个地址?段地址X16+偏移地址=物理地址(1)从学校走2826m到图书馆。这2826可以认为是图书馆的物理地址。(2)从学校走200Om到体育馆,从体育馆再走826m到图书馆。第一个距离200Om是相对于起点的根底地址;第二个距离826m是将对于根底地址的偏移地址。说明”段地址X16+偏移地址=物理地址"的思想:第二个比喻比方我们只能通过纸条来通信,读者问我图书馆的地址,我只能将它写在纸上告诉读者。显然我必须有一张可以容纳4位数据的纸条才能写下2826这个数据:段地址X16+偏移地址=物理地址不巧的是,没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以这种方式告诉读者2826这个数据:段地址X16+偏移地址=物理地址段的概念误认识:内存被划分成了一个一个的段,每一个段有一个段地址。其实是:内存并没有分段,段的划分来自于CPU,由于8086CPU用”段地址X16)+偏移地址=物理地址"的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。分段的方式来管理内存分段的方式来管理内存以后,在编程时可以根据需要,将假设干地址连续的内存单元看作一个段,用段地址xl6定位段的起始地址根底地址),用偏移地址定位段中的内存单元。两点需要注意段地址l6必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64K,所以一个段的长度最大为64K。内存单元地址小结CPU访问内存单元时,必、须向内存提供内存单元的物理地址。8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。思考两个问题1 .观察下面的地址,读者有什么发现?内存单元结论:CPU可以用不同的段地址和偏移地址形成同一个物理地址。2 .如果给定一个段地址,仅通过变化偏移地址来迸行寻址,最多可以定位多少内存单元?结论:偏移地址16位,变化范围为0FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。比方:给定段地址100OH,用偏移地址寻址,CPU的寻址范围为:IooooH1FFFFH.小结在8086PC机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。数据在21F60H内存单元中。”对于8086PC机的两种描述:懒存在内存20001F60单元中;数据存在内存的2000段中的1F60H单元中。可根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。检测点2.2段存放器段存放器就是提供段地址的。8086CPU有4个段存放器:CS、DS、SS、ES8086CPU要访问内存时,由这4个段存放器提供内存单元的段地址。CS和IPCS和IP是8086CPU中最关键的存放器,它们指示了CPU当前要读取指令的地址。CS为代码段存放器;IP为指令指针存放器。8086PC读取和执行指令相关部件8086PC读取和执行指令相关部件8086PC读取和执行指令演示8086PC工作过程的简要描述ACS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;IP=IP+所读取指令的长度,从而指向下一条指令;指令。转到步骤,重复这个过程。在8086CPU加电启动或复位后(即CPU刚开始工作时CS和IP被设置为CS=FFFFH,IP=OOOOHe即在8086PC机刚启动时,CPU从内存FFFFOH单元中读取指令执行。FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。在任何时候,CPU将CS.IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。修改CS、IP的指令在CPU中,程序员能够用指令读写的部件只有存放器,程序员可以通过改变存放器中的内容实现对CPU的控制。CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS.IP中的内容来控制CPU执行目标指令。我们如何改变CS、IP的值呢?8086CPU必须提供相应的指令先回想我们如何修改AX中的值?mov指令如:movax,123mov指令可以改变8086CPU大局部存放器的值,被称为传送指令。能够通过mov指令改变CS,IP的值吗?mov指令不能用于设置CS.IP的值,8086CPU没旬是供这样的功能。8086CPU为CS.IP提供了另外的指令来改变它们的值:转移指令同时修改CS、IP的内容:jmp段地址:偏移地址jmp2AE3:3jmp3:0B16功能:用指令中给出的段地址修改CS,偏移地址修改IPo仅修改IP的内容:jmp某一合法存放器jmpax类似于movIRaxJjmpb×功能:用存放器中的值修改IP。问题分析:CPU运行的流程内存中存放的机器码和对应汇编指令情况:初始:CS=2000H,IP=OOOOH)CPU运行的流程问题分析结果(1) movax,6622(2) jmp1000:3(3) movax,0000(4) movb×,a×(5) jmpb×(6) mova×,0123H转到第(3)步执行代码段对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。可以将长度为NN64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。代码段这段长度为10字节的字节的指令,存在从123BOH123B9H的一组内存单元中,我们就可以认为,123BOH123B9H这段内存单元是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10字节。如何使得代码段中的指令被执行呢?将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。CPU只认被CS:IP指向的内存单元中的内容为指令。所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。如刚刚的CS=123BH,IP=OOOOH0小结1.段地址在8086CPU的存放器中存放。当8086CPU要访问内存时,由段存放器提供内存单元的段地址。8086CPU有4个段存放器,其中CS用来存放指令的段地址。2、CS存放指令的段地址,IP存放指令的偏移地址。8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。3、8086CPU的工作过程:ACS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;IP指向下T指令;物满会转到步骤1,重复这个过程J4、8086CPU提供转移指令修改CS、IP的内容。实验一查看CPU和内存,用机器指令和汇编指令编程DEBUG工具的使用R命令杳看、改变CPU存放器的内容;D命令查看内存中的内容;E命令改写内存中的内容;U命令将内存中的机器指令翻译成汇编指令;T命令执行一条机器指令;A命令以汇编指令的格式在内存中写入一条机器指令。引言在第2章中,我们主要从CPU如何执行指令的角度讲解了8086CPU的逻辑结构、形成物理地址的方法、相关的存放器以及一些指令。这一章中,我们从访问内存的角度继续学习几个存放器。内存中字的存储在0地址处开始存放20000(4E20H):内存中字的存储主意;O号单元是氐地址单元,1号单元是高地址单元。问题:(1) 0地址单元中存放的字节型数据是多少?(2) 0地址字单元中存放的字型数据是多少?(3) 2地址字单元中存放的字节型数据是多少?(4) 2地址单元中存放的字型数据是多少?(5) 1地址字单元中存放的字型数据是多少?结论任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。DS和addressCPU要读取一个内存单元的时候,必、须先给出这个内存单元的地址;在8086PC中,内存地址由段地址和偏移地址组成。8086CPU中有一个DS存放器,通常用来存放要访问的数据的段地址。例如:我们要读取100oOH单元的内容可以用如下程序段进行:movb×,100OHmovds,bxmoval,0moval,O的mov指令可完成的两种传送功能:将数据直接送入存放器;将一个存放器中的内容送入另一个存放器中。除此之外,mov指令还可以将一个内存单元中的内容送入一个存放器。上面三条指令将100OOH(1000:0)中的数据读到al中。从哪个内存单元送到哪个存放器中呢?mov指令的格式:mov存放器名,内存单元地址表示一个内存单元,"广中的0表示内存单元的偏移地址。那么内存单元的段地址是多少呢?执行指令时,8086CPU自动取DS中的数据为内存单元的段地址。如何用mov指令从IOoOOH中读取数据?10000H表示为100O:0段地址:偏移地址将段地址IOoOH放入ds用moval,0完成传送mov指令中的口说明操作对象是一个内存单元,口中的。说明这个内存单元的偏移地址是0,它的段地址默认放在ds中如何把100OH送入ds?传送指令movax,l相似的方式movds,1000H?8086CPU不支持将数据直接送入段存放器的操作,ds是一个段存放器。硬件设计的问题movds,1000H是非法的。数据->通用存放器->段存放器问题:写几条指令,将al中的数据送入内存单元100OOH?思考后分析:)分析问题本质:怎样将数据从存放器送入内存单元?结论:movb×,100OHmovds,b×mov0tal一种合理的答复字的传送因为8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是一次性传送一个字。字的传送问题3.3:内存中的情况如下列图,写出下面指令执行后存放器ax,bx,c×中的值。字的传送思考后请看听小甲鱼慢慢分析。单步跟踪问题3.4:内存中的情况如下列图,写出下面指令执行后存放器axfbx,c×中的值。字的传送mov%add、SUb指令已学mov指令的几种形式:mov存放器,数据mov存放器,存放器mov存放器,内存单元mov内存单元,存放器mov段存放器,存放器根据指令进行推测:mov段存放器,存放器mov存放器,段存放器mov存放器,段存放器mov内存单元,存放器mov内存单元,段存放器mov段存放器,内存单元add和sub指令同mov一样,都有两个操作对象。mov存放器,段存放器它们可以对段存放器进行操作吗?请自行在DebUg中试验数据段前面讲过,对于8086PC机,我们可以根据需要将一组内存单元定义为一个E殳(可以是代码段、数据段等)。我们可以将一组长度为N(N64K),地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个雌段。比方我们用123BOH123B9H这段空间来存放数据:段地址:123BH长度IO字节如何访问数据段中的数据呢?将一段内存当作雌段,是我们在编程时的一种安排,我们可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,用相关指令访问辘段中的具体单元。我们将123BOH123BAH的内存单元定义为数据段,我们现在要累加这个数据段中的前3个单元中的数据,代码如下:访问数据段中的雌问题3.5写几条指令,累加数据段中的前3个字型数据。思考后看分析:累加数据段中的前3个字型数据注意:一个字型雌占两个单元,所以偏移地址是0、2、40小结(1)字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在彳氐地址单元中,高位字节存放再高地址单元中。(2)用mov指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS存放器中。3address表示一个偏移地址为address的内存单元。(4)在内存和存放器之间传送字型数据时,高地址单元和高8位存放器、低地址单元和低8位存放器相对应。5mov.add、SUb是具有两个操作对象的指令.jmp是具有一个操作对象的指令。(6)可以根据自己的推测,在Debug中实验指令的新格式。检测点3.1栈我们研究栈的角度:栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后迸入这个空间的数据,最先出去。用一个盒子和3本书来描述栈的操作方式出栈的方式入栈的方式入栈的方式出栈的方式出栈的方式出栈的方式栈有两个根本的操作:入栈和出栈。入栈:将一个新的元素放到栈顶;出栈:从栈顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的操作规那么:LIFO(LastInFirstOut,后进先出CPU提供的栈机制现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。8086CPU提供入栈和出栈指令:最根本的PUSH入栈POP出栈pushax:将存放器ax中的数据送入栈中;popax:从栈顶取出数据送入ax。8086CPU的入栈和出栈操作都是以字为单位进行的。下面举例说明,我们可以将IooOOH100OFH这段内存当作栈来使用。142023.11存放器内存访问04-零根底入门学习汇编语言16标签PUSh指令,栈,汇编语言汇编语言是否有疑惑?两个疑问1、CPU如何知道一段内存空间被当作栈使用?2、执行push和pop的时候,如何知道哪个单元是栈顶单元?分析:任意时刻,SS:SP指向栈顶元素。对于两个疑问的分析CPU如何指导当前要执行的指令所在的位置?答:存放器CS和IP中存放着当前指令的段地址和偏移地址。8086CPU中,有两个存放器:段存放器SS存放栈顶的段地址存放器SP存放栈顶的偏移地址任意时刻,ss:SP指向栈顶元素。push指令的执行过程pusha×SP=SP-2;将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。push指令的执行过程问题3.6:如果我们将IoOOOH1000FH这段空间当作栈,初始状态栈是空的,此时,SS=100OH,SP=?思考后看分析。push指令的执行过程SP=OOlOH我们将100oOH100OFH这段空间当作栈段,SS=100OH,栈空间大小为16字节,栈最底部的字单元地址为1000:000Eo任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=OOOEHo栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2,SP原来为OOOEH,加2后SP=IoH所以,当栈为空的时候,SS=100OH,SP=IOH0换个角度看任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2栈最底部字单元的地址为100O:000E,所以栈空时,SP=OOlOHP。P指令的执行过程popax将SS:SP指向的内存单元处的数据送入ax中;SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。PoP指令的执行过程出栈后,SS:SP指向新的栈顶IoOOEH,PoP操作前的栈顶元素,100oCH处的2266H依然存在,但是,它已不在栈中。当再次执行push等入栈指令后,SS:SP移至100OCH,并在里面写入新的数据,它将被覆盖。栈顶超界的问题SS和SP只记录了栈顶的地址,依靠SS和SP可以保证在入掰口出栈时找到栈顶。可是,如何能够保证在入栈、出栈时,栈顶不会超出栈空间?都将发生栈顶超界问题,栈顶超界是危险的。因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。毕竟一个计算机系统并不是只有我们自己的程序在运行但是由于我们在入栈出栈时的不/如心,而将这些数据、代码意外地改写,将会引发一连串的错误。(但如果是刻意的那么呵呵)我们当然希望CPU可以帮我们解决这个问题,比方说在CPU中有记录栈顶上限和下限的存放器,我们可以通过填写这些存放器来指定栈空间的范围,然后,CPU在执行PUSh指令的时候靠检测栈顶上限存放器,在执行POP指令的时候靠检测栈顶下限存放器保证不会超界。实际情况:8086CPU中并没有这样的存放器。8086CPU不保证对栈的操作不会超界。这就是说8086CPU只知道栈顶在何处由SS:SP指示,而不知道读者安排的栈空间有多大。这点就好似CPU只知道当前要执行的指令在何处由CS:SP指示而不知道读者要执行的指令有多少。从这两点我们可以看出8086CPU的工作机理,只考虑当前的情况:当前栈顶在何处;当前要执行的指令是哪一条。结论我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安封般的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。push和pop指令是可以在存放器和内存之间传送数据的。栈空间当然也是内存空间的一局部,它只是一段可以以一种特殊的方式进行访问的内存空间。push和pop指令的格式push存放器:将一个存放器中的雌入栈PoP存放器:出栈,用一个存放器接收出栈的数据例如:pushaxpopb×push段存放器:将一个段存放器中的数据入栈PoP段存放器:出栈,用一个段存放器接收出栈的雌例如:pushdspopespush内存单元:将一个内存单元处的字入栈栈操作都是以字为单位pop内存单元:出栈,用一个内存字单元接收出栈的数据例如:push0pop2指令执行时,CPU要知道内存单元的地址,可以在push,pop指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。问题3.7编程:将100OOHTOOOFH这段空间当作栈,初始状态是空的,将AX.BX.DS中的数据入栈。思考后看分析。push、PoP指令问题3.8编程:(1)将IOooOH1000FH这段空间当作栈,初始状态是空的;(2)设置AX=OOlAH,BX=OOlBH;(3)将AX、BX中的数据入栈;(4)然后将AX、BX清零;(5)从栈中恢复AX、BX原来的内容。思考后看分析。push、PoP指令从上面的程序我们看到,用栈来暂存以后需要恢复的存放器中的内容时,出栈的顺序要和入栈的顺序相反,因为最后入栈的存放器的内容在栈顶,所以在恢复时,要最先出栈。问题3.9(1)将IooOoH1000FH这段空间当作栈,初始状态是空的;(2)设置AX=Oo2AH,BX=002BH;(3)利用栈,交换AX和BX中的数据。思考后看分析。push、PoP指令问题3.10我们如果要在IoOOOH处写入字型数据2266H,可以用以下的代码完成:mova×t1000Hmovds,axmov,ax,2266HmovO,ax看题目:补在IoOOOH处写入字型数据2266H。movax,2266Hpusha×要求:不能使用"mov内存单元,存放器"这类指令思考后看分析。我们看需补全代码的最后两条指令,将ax中的2266H压入栈中,也就是说,最终应由pushax将2266H写入10000H处。问题的关键就在于:如何使pushax访问的内存单元是IOoOOH。PUSh指令是入栈指令。注意执行过程完整的程序:mova×t1000Hmovss,axmovsp,2movax,2266Hpushaxpush、pop实质上就是一种内存传送指令,可以在存放器和内存之间传送数据,与mov指令不同的是,push和PoP指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。同时,PUSh和PoP指令还要改变SP中的内容。我们要十分清楚的是,push和PoP指令同mov指令不同,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作。执行push时:先改变SP,后向SS:SP处传送。执行pop时:先读取SS:SP处的数据,后改变SP0i±三push、pop等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大为:OFFFFH.提供:SS.SP指示栈顶;改变SP后写内存的入栈指令;读内存后改变SP的出栈指令。这就是8086CPU提供的栈操作机制。栈的综述1. 8086CPU提供了栈操作机制,方案如下:在SS,SP中存放栈顶的段地址和偏移地址;提供入栈和出栈指令,他们根据ss:SP指示的地址,按照栈的方式访问内存单元。2. push指令的执行步骤:SP=SP-2

    注意事项

    本文(小甲鱼汇编课件.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开