<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=299&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 为什么dos下的com文件都要org 0100h呢？为什么系统启动时要org 07c00h呢]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=299</link>
		<description><![CDATA[为什么dos下的com文件都要org 0100h呢？为什么系统启动时要org 07c00h呢 最近发表的帖子。]]></description>
		<lastBuildDate>Fri, 26 Aug 2022 06:01:39 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[为什么dos下的com文件都要org 0100h呢？为什么系统启动时要org 07c00h呢]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=305#p305</link>
			<description><![CDATA[<p>这是因为 .com&#160; &#160;载入内存后的起始偏址就是100h.&#160; &#160;前面的100h字节是该程序的PSP 部分.&#160; &#160;所以, 为了程序中对地址引用的正确,&#160; &#160;必需加上org&#160; &#160;100h语句。<br />-------------------------------------------------------------------------------------------------------------------------------------------------<br />FFFF0h与07C00h，这两个都是机器启动后默认访问的内存地址。曾经让我一度很晕，搞不清他们之间的关系。现在终于搞明白了，<br />首先要知道bios是用来初始化硬件的最底层的软件（然后才是操作系统），因此计算机启动后必须最先被执行。另外我们都知道CPU只能执行内存中的内容的，而一般内存中的数据是易失性的，断电之后内容就会消失。工程师的解决方法是：将存放bios的rom芯片与内存芯片统一编址（不明白的话去看看微机原理与接口的书就明白了）。这样就可以把存放bios的ROM芯片看作是数据永远不会消失不允许被更改的内存了。<br />开机启动后默认的CS=FFFFh IP=0000h。这个地址就是bios的地址。这段内存空间很小，所以不能够容下操作系统等大型程序。<br />相对bios而言操作系统的功能更强大，更新也更快但是也需要更多的空间，通常放在硬盘中。但是如果没有bios的话，那么将会连硬盘都不能使用，又如何启动存放在硬盘中的操作系统呢？正是由于此，机器启动后自动执行bios使其它完成硬件初始化（这样包括硬盘在内的cpu以外的其他硬件设备就可以工作了）。bios完成硬件初始化的任务后，就要把权力移交给操作系统。<br />工程师进行了强制性的规定：到内存中的07c00h 处寻找系统的引导程序，即CS=0000h IP=7c00h。也就是说任何系统，他的引导程序都必须安排在07c00h开始的地方，否则就不能被正确的引导。当引导程序完成后我们就进入了Linux Windows等系统了。<br />后面为了调试方便，还可以吧org 07c00h改为0100h,生成 com文件就能直接在dos下运行。cx表示的是字符串的个数，10进制的，可以自行修改，boot sector的结束地址也是固定的，为0xAA55,呵呵，好玩<br />书中的代码如果要在DOS下运行，需要把org 07C00h改为org 0100h，这样做的目的是因为在DOS下，装载程序会事先创建一个称为程序段前缀（PSP）256字节的数据区，用来和被装载的程序通信，具体的细节请查验相关资料。而0100h刚好是256个字节的处，这也是代码段开始执行处。 <br />&#160; &#160; &#160; &#160;说完程序的加载运行，让我们看看BIOS的10号中断处理子程序的显示功能。这里10号中断有很多子程序，书中用到了13子程序，此子程序就是显示字符串的，其中的参数如下：ES:BP=串地址；CX=串长度；DH=起始行；DL=起始列；BH=页号；BL=属性；AH=子程序编号，这里为13；这里BL是这样子定义的：闪烁 背景红 背景绿 背景蓝 高亮 前景红 前景绿 前景蓝（顺序为高字节到低字节）。这样BL=0Ch，二进制为：1100，由其定义可知为黑底高亮红字。</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Fri, 26 Aug 2022 06:01:39 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=305#p305</guid>
		</item>
	</channel>
</rss>
