首页 汇编语言入门 三

汇编语言入门 三

举报
开通vip

汇编语言入门 三汇编语言入门 三 第二讲内存映象 之所以把这个内存单独放一章,是为了说明它的重要性,后面的几乎很多程序都需要你对这一章的理解。这里的内存映象就是指当你把一个可执行文件(EXE或COM文件)放到内存后,整个内存"看"起来是什么样子的。 前面讲过,这里汇编程序只能访问1M的内存空间,所以下面就以1M内存为例。并且以DOS操作系统作为讲解对象,所以所编出来的程序也仅是DOS程序。事实上,通过winasm可以访问远远超过1M的空间,并且可以编出FOR windows的程序。但那是另外的话题。我们暂且不说那些。 2....

汇编语言入门 三
汇编语言入门 三 第二讲内存映象 之所以把这个内存单独放一章,是为了说明它的重要性,后面的几乎很多程序都需要你对这一章的理解。这里的内存映象就是指当你把一个可执行文件(EXE或COM文件)放到内存后,整个内存"看"起来是什么样子的。 前面讲过,这里汇编程序只能访问1M的内存空间,所以下面就以1M内存为例。并且以DOS操作系统作为讲解对象,所以所编出来的程序也仅是DOS程序。事实上,通过winasm可以访问远远超过1M的空间,并且可以编出FOR windows的程序。但那是另外的话MATCH_ word word文档格式规范word作业纸小票打印word模板word简历模板免费word简历 _1714506047931_0。我们暂且不说那些。 2.1内存映象 首先,这1M内存如果我们不再以二维的方式看,而是一维的,线性地看(二维和一维的转化方式参见前面章节)。但描述还是以二维的方式描述,从最底端到最高端依次是: 1 中断向量区:该区由0000:0000~0000:03FF。这里存着系统的所有中断的中断向量表,对于中断向量表,你现在先理解为一些程序的首地址。由这个地址你就能找到该程序。 2 系统数据区:该区由0040:0000~0040:XXXX(不好意思,忘了),这里存着整个系统中,DOS操作系统要用的数据,由于这个区的数据对用户是开放的,所以用户当然也可以从这里读出来用。 3 DOS操作系统区:操作系统常驻内存,你向计算机发的每个命令其实都是操作系统执行的。这个区的大小主要是由操作系统的版本和用户的配置大小决定,如果是驱动程序配置,就放到根目录下的config.sys里,如果是程序, 就放到autoexec.bat里。这里设置在现在的windows 95/98/nt/me/2000/xp/2003中仍然有,所以我就不多说了。 4 用户程序,这个当然就是你执行的程序了,这种程序分两种,一种是扩展名为com文件,一种是exe文件,从程序内部看,前者程序的四个段重合(后面要讲这四个段),所以最大长度只等于一个段,用前面段地址的理解就是com文件最大只能是64K,所以com文件只适合小的程序。而exe,四个段可任何分配,并可扩充段,而且每个段的段地址可以任何改动,因此exe的访问内存能力大多了。这种格式访问能力只受地址结构的限制了。 用户程序所占的内存大小完全由程序本身决定,但最大,只能到640K。这一点,怪不得别人,只能怪当前计算机软硬件设置高手高手高高手们(包括比尔盖茨)们的失误了,60年代的超级计算机只有36K的内存,所以他们就在80年代得到一个结论:640K的内存足够了。 如果用户程序大于由操作系统所占内存的顶底到640K之间的内存量,就会显示:内存不够,因而程序不能执行。这种现象对于一开始就用windows的人来说,几乎没见过,但对于一开始用DOS并打汉字的人来说,再正常不过。如果小于这段内存,多余部分就空着。 5从640K到1M-64K,这段内存就很难说清了。这段内存中有一部分被硬件占有,有一部分是显示缓冲区点有,还有一部分是系统ROM占有。 6从1M-64K到1M之间的这段64K的内存叫作HMA。这段内存是小孩没娘,说来话长,我们先不说他。 2.2验证上面的理论 2.2.1中断向量表 中断向量表就是所有中断向量首地址表,这里保存着每个中断程序的首地址,几乎所有的汇编书都把中断后面后面的章节中,并且对中断的解释也仅从字面意思解释,所以导致大学对中断的不重要和误解。没耐心的没到这个章节 就不学汇编了,有耐心的到这里才豁然开朗。我现在不讲中断的原意。我直接告诉你,你把中断当成API也许更合适。也就是说,别人把很多已作好的功能放到了内存中。并且把调用这一功能的号告诉了你,你只要调用这些功能号,系统就自动从这个中断向量表中找到对应的中断,然后执行你的功能。 首先让你感受一下中断的魅力一下吧。比如中断21H的2A功能调用是读取系统的日期,这个调用的规则是,调用前AH寄存器置为2A。调用后年在CX中,月在DH中,DL在日中,星期在AL中。 -a 139D:0100movah,2a 139D:0102int21 139D:0104int3 139D:0105 -g=100 AX=2A05BX=0000CX=07D4DX=0C18SP=FFEEBP=0000SI=0000DI=0000 DS=139DES=139DSS=139DCS=139DIP=0104NVUPEIPLNZNAPONC 139D:0104CCINT3 - 可能上面的程序你目前还看不懂。不过没关系,"movah,2a"表示调用功能号是2a号。"int21"表示调用十六进制21号中断,"int 3"表示3号中断,表示程序运行到这一句时停一下。"g=100"表示从"139D:0100"开始执行。 AX=2A05BX=0000CX=07D4DX=0C18SP=FFEEBP=0000SI=0000DI=0000 DS=139DES=139DSS=139DCS=139DIP=0104NVUPEIPLNZNAPONC 表示执行的结果。其中CX是年,这个年是由CX中存。07D4十进制就是2004年。DH+DL=DX,所以DH=0C,DL=18。二者转化为十进制就是DH=12,DL=24,也就是今天了。AX=AH+AL=2A05,所以AL=05。那就是今天是星期五。 上面可能你们现在还看不懂,不过通过解说你应该可以知道,仅仅两行命令,就读到了现在的值。现在需要作的就是把这些值提取出来用作他用了。 从中断的作来与中断向量表又有什么关系呢?原来你在汇编里运行int21时,系统就在上面的中断向量表中找到int 21的中断地址,该中断的地址应该位于:0000:0084~0000:0087,具体算法前面已说明了。 -d0000:00840087 0000:00807C10A700|. - 找到 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 是:00A7:107C。然后系统就转到这个地址执行int21。 2.2.2系统数据区前面都已说明过。不再多说。系统区,很多DOS中断程序实现部分就在这个区。程序运行区依不同的程序而不用。 2.2.3640 K~1M之间,这期间有些地方是ROM,有些地方是硬件的BIOS区。我仅以两个例子说明这一区。 ROM区:ROM区就是只读内存,也就是说这个区的数据只能读不能写。比如F000:0000开始的内存是ROM。我们来写一下,然后再看看效果。 -df000:00000005'显示由F000:0000到F000:0005的六个字节值。 F000:000004 E8A2FFF9C3. -ef000:0000'修改命令 F000:000004.00 E8.00A2.00FF.00F9.00C3.00'注意,.后面的是我改的,把这几个值都改成0了。 -df000:00000005'再次显示这个区的数据。 F000:000004 E8A2FFF9C3. - 通过上面测试,发现该区数据仍然未改变。但你要是试别的RAM区的,肯定会变。如果想试你自己试试吧。 显示缓冲区:在文本方式下,B800:0000开始的地址保存着屏幕上每个字符位置的值。在文本方式下,屏幕被分为80X 25。每个位置有两个值,一个值是ASCII字符,一个值是该ASCII的属性值(主要是颜色)。所以一个屏幕共有80X25X2=400个字符。 我们来改: -db800:00000010'显示屏幕缓冲区的内容,注意此时本行最左边的"-"是屏幕左上角。 B800:00002D 07640720076207-3807300730073A07-.d.b.8.0.0.:. B800:0010300 - 看上面的命令,屏幕最上边一行是"-db800:00000010",所以他的内容就是"2D 07640720076207-3807 300730073 A 07"其中,2D是"-"的ASCII值,07是"-"的属性值。64是"d"的ASCII值,07是"d"的属性值。 现在修改这些值。我把左上角的字改成黄颜色的"-",那当然是改b800:0001的属性值了。 -eb800:00010e 是不是左上角的颜色变成黄色了吗? 好了,把第二个字符变成绿色的"-"吧? -eb800:00022d0b 变了吗? 可执行文件内存映象 DOS下可执行文件有两种(BAT是批处理文件,他只是简单调用DOS内部命令或其它程序,所以此处不认为它是可执行文件),一种是COM文件,一种是EXE文件,前面提到,COM文件一般小于64K。EXE文件则可以任意大。为什么呢? 说到这里,还要提到段。每个段64K。段的作用就是数据组织单位。段的类型有三种:代码段(CodeSegment,简称CS)、数据段(Data Segment,简称 DS)、栈段(StackSegment,简称SS),另外还有一个附加数据段(Extra Segment,简称ES),它的用与数据段DS可以认为完全一样,当数据段的64K不够用,或你就需要把数据放到两个段中以便移动、复制、比较时,才用到附 。(当然,移动、复制、比较操作在一个段中也可以完成)。 加数据段ES 1段的作用。 1.1 代码段(CS),程序装入内存中,DOS怎么知道是从哪里执行呢? 答案 八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案 就是系统自动从代码段指定位置开始执行,并且始终在代码段中执行。内此代码段CS的作用就是保存所有的指令。这里所说的代码也就是汇编指令了。所以编写汇编程序也就主要是编写代码段中的代码。 1.2数据段(DS)、附加段(ES),顾名思义,数据段中存的就是数据,这些数据供代码段的程序调用。附加段就是附加数据段。作用与数据段相同。 1.3 栈段(SS),这个段非常重要,但实际上,你在使用中,似乎用不着这个段,但实际上,这是黑客编程中最重要的一部分,而且系统会不停地"偷偷地"使用这个段,正是这个偷偷地用,使得系统的很多动作被记录到这个段中。还有两点,你必须记住:一是如果你使用了这个栈,比如你把数据存到这个栈中,则必须有相应的出栈命令,并且入几个数据,就得出几个数据,多一个或少一个,你的程序就可能导致死机或异常;二是你要把握操作时机,比如你不能在系统使用栈的前后使用栈,比如你在调用子程序之前入栈,而在子程序中出栈,而在系统调用子程序时,系统也要使用栈,这种也将导致出错。 栈就是一种先入后出(也有称为后入先出)的结构,有地址由小到大的增加栈,有地址由大到小的逆向减栈。 2段重叠 从上面,我们可以看到,CS,DS,SS三者作用各不相同,内存就是象录音磁带,录新歌,则旧歌被删,带子上存的始终是最后录的那段音乐。因此,如果重叠则必然相互冲突。那还能重叠吗? 这里所说的重叠不是指内容重叠,而是指概念上的重叠,即数据相互放到一个段中,但相互可以区分开。比如某一段既有数据也有代码,则代码在每要执行到数据之前加一个跳转指令跳过这段代码。这个跳转指令要求用户在编程的时候加上。 而栈段呢?栈段有自己的特殊性,特殊就在于系统也会自动地使用,而用户则又在不知道系统在使用的情况下使用。避免这种冲突的方法就是采用逆向的栈段。 2COM文件内存映象。 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。
本文档为【汇编语言入门 三】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_212655
暂无简介~
格式:doc
大小:22KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-10-19
浏览量:10