- 1、本文档共45页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.7 一段安全的空间 在8086模式中,随意向一段内存空间写入内容是很危险的 ,因为这段空间中可能存放着重要的系统数据或代码。 比如下面的指令: mov ax,1000h mov ds,ax mov al,0 mov ds:[0],al 5.7 一段安全的空间 以前在Debug中,为了讲解上的方便,写过类似的指令。 但这种做法是不合理的 ,因为之前我们并没有论证过 1000:0中是否存放着重要的系统数据或代码。 如果1000:0中存放着重要的系统数据或代码,“mov ds:[0],al” 将其改写,将引发错误。 比如程序 5.7 一段安全的空间 可见,在不能确定一段内存空间中是否存放着重要的放据或代码的时候,不能随意向其中写入内容。 不要忘记,我们是在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。 5.7 一段安全的空间 同样不能忘记,我们正在学习的是汇编语言,要通过它来获得底层的编程体验,理解计算机底层的基本工作机理。 所以我们尽量直接对硬件编程,而不去理会操作系统。 5.7 一段安全的空间 我们似乎面临一种选择,是在操作系统中安全、规矩地编程,还是自由、直接地用汇编语言去操作真实的硬件,了解那些早己被层层系统软件掩盖的真相? 在大部分的情况下,我们选择后者,除非我们就是在学习操作系统本身的内容。 5.7 一段安全的空间 注意: 我们在纯DOS方式(实模式)下,可以不理会DOS,直接用汇编语言去操作真实的硬件,因为运行在CPU实模式下的DOS,没有能力对硬件系统进行全面、严格地管理。 5.7 一段安全的空间 但在Windows XP\2000、UNIX这些运行于CPU保护模式下的操作系统中,不理会操作系统,用汇编语言去操作真实的硬件,是根本不可能的。 硬件已被这些操作系统利用CPU保护模式所提供的功能全面而严格地管理了。 5.7 一段安全的空间 在后面的课程中,我们需要直接向内存中写入内容,可我们又不希望发生图5.17中的那种情况。所以要找到一段安全的空间供我们使用。 在一般的PC机中,DOS方式下,DOS和其他合法的程序一般都不会使用0:200~0:2FF( 0:200h~0:2FFh)的256 个字节的空间。所以,我们使用这段空间是安全的。 5.7 一段安全的空间 不过为了谨慎起见,在进入DOS后,我们可以先用Debug 查看一下,如果0:200~0:2FF单元的内容都是0的话,则证明DOS 和其他合法的程序没有使用这里。 为什么DOS和其他合法的程序一般都不会使用0:200~0:2FF这段空间?我们将在以后的课程中讨论这个问题。 5.7 一段安全的空间 总结一下: (1)我们需要直接向一段内存中写入内容; (2)这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误。 (3)DOS方式下,一般情况, 0:200~0:2FF 空间中没有系统或其他程序的数据或代码; (4)以后,我们需要直接向一段内存中写入内容时,就使用0:200~0:2FF这段空间。 5.8 段前缀的使用 我们考虑一个问题: 将内存ffff:0~ffff:b段元中的数据拷贝到 0:200~0:20b单元中。 分析一下 程序代码 改进的程序代码 分析一下: (1) 0:200~0:20b单元等同于0020:0~0020:b单元,它们描述的是同一段内存空间: (2)拷贝的过程应用循环实现,简要描述如下: 初始化:X=0 循环12次: 将ffff:X单元中的数据送入0020:X(需要用一个寄存器中转) X=X+1 分析两下: (3)在循环中,源单元ffff:X和目标单元的0020:X的偏移地址X是变量。我们用bx来存放。 (4)我们用将0:200~0:20b用0020:0~0020:b描述,就是为了使目标单元的偏移地址和源始单元的偏移地址从同一数值0开始。
返 回 程序代码分析 因源单元ffff:X和目标单元0020:X 相距大于64KB,在不同的64KB段里,程序中,每次循环要设置两次ds。 这样做是正确的,但是效率不高。 我们可以使用两个段寄存器分别存放源单元ffff:X和目标单元0020:X的段地址,这样就可以省略循环中需要重复做12次的设置ds的程序段。
改进的程序分析 改进的程序中,使用 es 存放目标空间0020:0~0020:b的段地址,用ds存放源空间ffff:0~ffff:b的段地址。 在
文档评论(0)