《汇编语言》讲稿_06.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6.3 将数据、代码、栈放入不同的段 ② 我们在源程序中用伪指令 “assume cs:code,ds:data,ss:stack”将cs、ds和ss分别和code、data、stack段相连。 这样做了之后,CPU是否就会将 cs指向 code,ds 指向 data,ss 指向stack,从而按照我们的意图来处理这些段呢? 6.3 将数据、代码、栈放入不同的段 当然也不是,要知道 assume 是伪指令,是由编译器执行的,也是仅在源程序中存在的信息,CPU并不知道它们。 我们不必深究 assume 的作用,只要知道需要用它将你定义的具有一定用途的段和相关的寄存器联系起来就可以了。 6.3 将数据、代码、栈放入不同的段 ③ 若要CPU按照我们的安排行事,就要用机器指令控制它,源程序中的汇编指令是CPU要执行的内容。 6.3 将数据、代码、栈放入不同的段 CPU如何知道去执行它们? 我们在源程序的最后用“end start”说明了程序的入口,这个入口将被写入可执行文件的描述信息,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序中的第一条指令。 标号“start”在“code”段中,这样CPU就将code段中的内容当作指令来执行了。 6.3 将数据、代码、栈放入不同的段 我们在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 将数据、代码、栈放入不同的段 总之,CPU到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。 我们完全可以将程序6.4 写成这样,实现同样的功能。程序6.4源码 《汇编语言》课件             王爽 著-清华大学出版社 第6章 包含多个段的程序 6.1 在代码段中使用数据 6.2 在代码段中使用栈 6.3 将数据、代码、栈放入不同的段 引言 前面我们写的程序中,只有一个代码段。 现在有一个问题是: 如果程序需要用其他空间来存放数据,我们使用哪里呢? 引言 第5章中,我们讲到要使用一段安全的空间。 可哪里安全呢? 第5章中,我们说0:200~0:300是相对安全的; 可这段空间的容量只有256个字节,如果我们需要的空间超过256个字节该怎么办呢? 引言 对于使用多个段的问题,我们先简单说到这里,下面我们将以这样的顺序来深入地讨论多个段的问题: (1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况; (2)将数据、代码、栈放入不同的段中。 6.1 在代码段中使用数据 考虑这样一个问题,编程计算以下8个数据的和,结果存在ax 寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。 在前面的课程中,我们都是累加某些内存单元中的数据,并不关心数据本身。 可现在我们要累加的就是已经给定了数值的数据。 6.1 在代码段中使用数据 assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h mov bx,0 mov ax,0 mov cx,8 s: add ax,cs:[bx] add bx,2 loop s mov ax,4c00h int 21h codesg ends end 程序6.1 6.1 在代码段中使用数据 解释一下,程序第一行中的 “dw”的含义是定义字型数据。dw即define word。 在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。 6.1 在代码段中使用数据 程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢? 由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从CS中得到它们的段地址。 6.1 在代码段中使用数据 这8个数据的偏移地址是多少呢? 因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8 个数据就在代码段的偏移0、2、4、6、8、A、C、E处。 程序运行时,它们的地址就是CS:0、CS:2、CS:4、CS

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档