当前位置: 网学 > 编程文档 > 汇编语言 > 正文

学习汇编前你应该知道的知识2 内存映象

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式
停地“偷偷地”使用这个段,正是这个偷偷地用,使得系统的很多动作被记录到这个段中。还有两点,你必须记住:一是如果你使用了这个栈,比如你把数据存到这个栈中,则必须有相应的出栈命令,并且入几个数据,就得出几个数据,多一个或少一个,你的程序就可能导致死机或异常;二是你要把握操作时机,比如你不能在系统使用栈的前后使用栈,比如你在调用子程序之前入栈,而在子程序中出栈,而在系统调用子程序时,系统也要使用栈,这种也将导致出错。
栈就是一种先入后出(也有称为后入先出)的结构,有地址由小到大的增加栈,有地址由大到小的逆向减栈。
2 段重叠
从上面,我们可以看到,CS,DS,SS三者作用各不相同,内存就是象录音磁带,录新歌,则旧歌被删,带子上存的始终是最后录的那段音乐。因此,如果重叠则必然相互冲突。那还能重叠吗?
这里所说的重叠不是指内容重叠,而是指概念上的重叠,即数据相互放到一个段中,但相互可以区分开。比如某一段既有数据也有代码,则代码在每要执行到数据之前加一个跳转指令跳过这段代码。这个跳转指令要求用户在编程的时候加上。
而栈段呢?栈段有自己的特殊性,特殊就在于系统也会自动地使用,而用户则又在不知道系统在使用的情况下使用。避免这种冲突的方法就是采用逆向的栈段。
2 COM文件内存映象。
    COM文件被读到内存中后,该文件的前100H个字节被操作系统使用,操作系统使用这256个字节保存一些系统要使用的数据,汇编语言编程者不能在这里存自己的数据,但在知道这此数据的作用后可以使用其中的数据。从100H开始,就是程序的开始了。COM文件之所以最大只能有64K,其原因是COM文件的四个段是相互重叠的。也就是说,CS,DS,SS,ES四个段的地址都指向这个COM文件的100H处。程序代码、数据、栈都在由100H到64K的区域内。如何把三者分开呢?栈段采用逆向栈,这个栈由64K开始,随着数据入栈,则地址就减小。这样作的好处是,栈段由高端向低端进展,可以详细与数据、代码分开;坏处也不言而喻,假如一个COM程序大量用到栈(比如是个递归程序)因此栈就不停地降低,而程序代码本身也很多,甚至不停地申请新空间,这样数据和栈就会在中间碰头,导致程序被破坏。
    区分开数据代码段与栈段后,下面讨论把数据段和代码段也分开。这个简单的多,只要逻辑上分开就可以。不过一般的方法就是:在100H处放一个跳转指令,随后放数据,然后再放置其它的代码。而100H处的跳转指令就跳到这里。
因此,COM文件内存映象就是:
CS:0000    (由于COM的CS,DS,SS,ES三段重叠,因此此行前CS,写成DS,SS,ES都一样)。  
CS:0100      一个跳转到YYYY地址的跳转指令。
CS:0101      本程序所需要用到的数据
CS:XXXX      数据结束处。
CS:YYYY      程序代码保存处。
CS:ZZZZ      程序代码结束处。
CS:FFFF      栈段开始处(注意栈是地址越来越小,所以这里是开始而不是结束处),也是程序的结束处。另外,此处FFFF与前面XXXX,YYYY,ZZZZ不一样,这里是十六进制的64K。

3. EXE文件
    比起COM文件,EXE文件要复杂一些,他的复杂就在于COM文件前面规定了100H个字节用于系统使用,而EXE文件则有个文件头,文件头的大小看具体内容多少。文件头的内容使得EXE看起来复杂了,但也更灵活了。更重要的是,对于病毒设计者,这个文件头使他们如鱼得水。因为文件头处
EXE文件的内存映象为:
XXXX:0000 文件头
XXXX:YYYY 文件头结束处。

CS:0000 代码段开始处
CS:ZZZZ 代码

  • 下一篇资讯: 汇编语言的重要性
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号