《汇编语言》讲稿.ppt

上传人:豆**** 文档编号:25241668 上传时间:2022-07-10 格式:PPT 页数:36 大小:784.50KB
返回 下载 相关 举报
《汇编语言》讲稿.ppt_第1页
第1页 / 共36页
《汇编语言》讲稿.ppt_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《《汇编语言》讲稿.ppt》由会员分享,可在线阅读,更多相关《《汇编语言》讲稿.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、汇编语言讲稿汇编语言讲稿本课件由汇编网()制作提供第6章 包含多个段的程序n6.1 在代码段中使用数据n6.2 在代码段中使用栈n6.3 将数据、代码、栈放入不同的段本课件由汇编网()制作提供引言n前面我们写的程序中,只有一个代码段。n现在有一个问题是: 如果程序需要用其他空间来存放数据,我们使用哪里呢?本课件由汇编网()制作提供引言n第5章中,我们讲到要使用一段安全的空间。 可哪里安全呢? 第5章中,我们说0:2000:300是相对安全的;n可这段空间的容量只有256个字节,如果我们需要的空间超过256个字节该怎么办呢?本课件由汇编网()制作提供引言n对于使用多个段的问题,我们先简单说到这里

2、,下面我们将以这样的顺序来深入地讨论多个段的问题:n(1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况;n(2)将数据、代码、栈放入不同的段中。 本课件由汇编网()制作提供6.1 在代码段中使用数据n考虑这样一个问题,编程计算以下8个数据的和,结果存在ax 寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。n在前面的课程中,我们都是累加某些内存单元中的数据,并不关心数据本身。n可现在我们要累加的就是已经给定了数值的数据。 本课件由汇编网()制作提供6.1 在代码段中使用数据assume cs:codesgcodes

3、g segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h mov bx,0mov ax,0mov cx,8 s: add ax,cs:bxadd bx,2loop smov ax,4c00hint 21hcodesg endsendn程序6.1本课件由汇编网()制作提供6.1 在代码段中使用数据n解释一下,程序第一行中的 “dw”的含义是定义字型数据。dw即define word。n在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。本课件由汇编网()制作提供6.1 在代码段中使用数据

4、n程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢? 由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从CS中得到它们的段地址。本课件由汇编网()制作提供6.1 在代码段中使用数据n这8个数据的偏移地址是多少呢? 因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8 个数据就在代码段的偏移0、2、4、6、8、A、C、E处。 程序运行时,它们的地址就是CS:0、CS:2、CS:4、CS:6、CS:8、CS:A、CS:C、CS:E。本课件由汇编网()制作提供6.1 在代码段中使用数据n程序中,我们用bx存放加2递增的偏移地址,用循环来进行累加。 在循环

5、开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。 每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在的字单元。本课件由汇编网()制作提供6.1 在代码段中使用数据n我们将前面的程序6.1编译、连接为可执行文件p61.exe,先不要运行,我们用debug加载查看一下。 本课件由汇编网()制作提供6.1 在代码段中使用数据n用 Debug加 载后,我们可以将 IP 设置为10h,从而使CS:IP指向程序中的第一条指令。然后再用T命令、P命令、或者是G 命令执行。n可是这样一来,我们就必须用Debug 来执行程序。 程序 6.1 编译成可执行文件后,在系统中直接运行可能会

6、出现问题,因为程序的入口处不是我们所希望执行的指令。 本课件由汇编网()制作提供6.1 在代码段中使用数据n如何让这个程序在编译后可以存系统中直接运行呢?我们可以在源程序中指明界序的入口所在,具体做法见下面的程序6.2。n程序代码本课件由汇编网()制作提供6.1 在代码段中使用数据assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov bx,0 mov ax,0 mov cx,8 s: add ax,cs:bx add bx,2 loop s mov ax,4c00h

7、 int 21hcodesg endsend startn程序6.2本课件由汇编网()制作提供6.1 在代码段中使用数据n注意在程序6.2中加入的新内容,我们在程序的第一条指令的前面加上了一个标号start,而这个标号在伪指令end的后面出现。 本课件由汇编网()制作提供6.1 在代码段中使用数据n探讨end的作用: end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。 本课件由汇编网()制作提供6.1 在代码段中使用数据n有了这种方法,我们就可以这样来安排程序的框架:assume cs:codecode segment : 数据 :start: : : 代码 : :cod

8、e endsend start本课件由汇编网()制作提供6.2 在代码段中使用栈n完成下面的程序,利用栈,将程序中定义的数据逆序存放。 assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ? code ends endn程序大致思路本课件由汇编网()制作提供6.2 在代码段中使用栈n程序的思路大致如下:n程序运行时,定义的数据存放在cs:0cs:15单元中,共8个字单元。依次将这8个字单元中的数据入栈,然后再依次出栈到这 8 个字单元中,从而实现数据的逆序存放。本课件由汇编网()制

9、作提供6.2 在代码段中使用栈n程序的思路大致如下: (续)n问题是,我们首先要有一段可当作栈的内存空间。如前所述,这段空间应该由系统来分配。我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。 本课件由汇编网()制作提供6.2 在代码段中使用栈n程序6.3源码n注意程序6.3中的指令: mov ax,cs mov ss,ax mov sp,32 我们要讲 cs:16 cs:31 的内存空间当作栈来用,初始状态下栈为空,所以 ss:sp要指向栈底,则设置ss:sp指向cs:32。如果对这点还有疑惑,建议回头认真复习一下第三章。本课件由汇编网()制作提供6.2 在代码段中使

10、用栈n比如对于: dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H 我们可以说,定义了8个字型数据,也可以说,开辟了8个字的内存空间,这段空间中每个字单元中的数据依次是: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。 因为它们最终的效果是一样的。本课件由汇编网()制作提供特别提示n检测点6.1(Page 119)n没有通过检测点,请不要向下学习!本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n在前面的内容中,我们在程序中用到了数据和栈,我们将数据、栈和代码都放到了一个段里面。

11、我们在编程的时候要注意何处是数据,何处是栈,何处是代码。 这样做显然有两个问题:n(1)把它们放到一个段中使程序显得混乱;n(2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n但如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64 KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样)。 所以,我们应该考虑用多个段来存放数据、代码和栈。 本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n怎样做呢?n我们用和定义代码段一样的方

12、法来定义多个段,然后在这些段里面定义需要的数据,或通过定义数据来取得栈空间。 具体做法如程序6.4所示,这个程序实现了和程序6.3 一样的功能,不同之处在于它将数据、栈和代码放到了不同的段中。本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n程序中“data”段中的数据“0abch”的地址就是:data:6。 我们要将它送入bx中,就要用如下的代码: mov ax,data mov ds,ax mov bx,ds:6 我们不能用下面的指令: mov ds,data mov ax,ds:6本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n其中指令“mov ds,dat

13、a” 是错误的,因为8086CPU不允许将一个数值直接送入段寄存器中。 程序中对段名的引用,如指令“mov ds,data”中的“data”,将被编译器处理为一个表示段地址的数值。本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n(3)“代码段”、“数据段”、“栈段”完全是我们的安排 现在,我们以一个具体的程序来再次讨论一下所谓的“代码段”、“数据段”、“栈段”。本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n 我们在源程序中用伪指令 “assume cs:code,ds:data,ss:stack”将cs、ds和ss分别和code、data、stack段相连。

14、这样做了之后,CPU是否就会将 cs指向 code,ds 指向 data,ss 指向stack,从而按照我们的意图来处理这些段呢?本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n当然也不是,要知道 assume 是伪指令,是由编译器执行的,也是仅在源程序中存在的信息,CPU并不知道它们。n我们不必深究 assume 的作用,只要知道需要用它将你定义的具有一定用途的段和相关的寄存器联系起来就可以了。本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n 若要CPU按照我们的安排行事,就要用机器指令控制它,源程序中的汇编指令是CPU要执行的内容。本课件由汇编网()制作提供

15、6.3 将数据、代码、栈放入不同的段nCPU如何知道去执行它们? 我们在源程序的最后用“end start”说明了程序的入口,这个入口将被写入可执行文件的描述信息,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序中的第一条指令。n标号“start”在“code”段中,这样CPU就将code段中的内容当作指令来执行了。本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n我们在code段中,使用指令: mov ax,stack mov ss,ax mov sp,16 设置ss指向stack,设置ss:sp指向stack:16, CPU 执行这些指令后,将把stack段当做栈空间来用。 CPU若要访问data段中的数据,则可用 ds 指向 data 段,用其他的寄存器(如:bx)来存放 data段中数据的偏移地址。本课件由汇编网()制作提供6.3 将数据、代码、栈放入不同的段n总之,CPU到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。n我们完全可以将程序6.4 写成这样,实现同样的功能。程序6.4源码

展开阅读全文
相关资源
相关搜索

当前位置:首页 > pptx模板 > 企业培训

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁