要回答您的问题,请注意,这是主观的,因为有不同的处理器,不同的平台,不同的汇编程序和C编译器,在这种情况下,我将讨论英特尔x86平台。
- 汇编程序不会编译为纯二进制文件,它们是原始的机器代码,它使用段(例如数据,文本和bss等)来定义,但其中一些称为目标代码。 链接器进入并调整段以使其可执行,即可以运行。 顺便说一句,使用gcc进行编译时的默认输出是'a.out',这是汇编输出的简写形式。
- 在DOS时代,引导加载程序有一个特殊的指令定义,通常会找到诸如
.Org 100h
之类的指令,该指令将汇编程序代码定义为.EXE变种之前的.COM变体。 另外,您不需要使用MSDOS附带的旧版debug.exe来生成.COM文件的汇编程序,就可以解决小型简单程序的问题,.COM文件不需要链接程序,并且可以直接使用- 运行二进制格式。 这是一个使用DEBUG的简单会话。
1:*a 0100
2:* mov AH,07
3:* int 21
4:* cmp AL,00
5:* jnz 010c
6:* mov AH,07
7:* int 21
8:* mov AH,4C
9:* int 21
10:*
11:*r CX
12:*10
13:*n respond.com
14:*w
15:*q
这将生成一个名为“ respond.com”的随时可运行的.COM程序,该程序等待按键并不将其回显到屏幕上。 请注意,开始时使用的“ a 100h”表示指令指针从100h开始,这是.COM的功能。 这个旧脚本主要用于批处理文件中,等待响应而不回显。 原始脚本可以在这里找到。
同样,在使用引导加载程序的情况下,它们会转换为二进制格式,而DOS附带有一个名为EXE2BIN的程序。 那是将原始目标代码转换成可以复制到可引导磁盘上进行引导的格式的工作。 请记住,没有链接程序针对汇编代码运行,因为该链接程序用于运行时环境,并且设置了代码以使其可运行和可执行。
BIOS在引导时,期望代码位于以下位置:offset:offset,0x7c00,如果我的内存正确无误,则该代码(在EXE2BIN之后)将开始执行,然后引导加载程序将其自身重新定位到内存中的较低位置并继续加载 发出int 0x13以从磁盘读取,打开A20门,启用DMA,在BIOS处于16位模式时切换到保护模式,然后将从磁盘读取的数据加载到内存中,然后引导加载程序发出一个远跳转 放入数据代码(可能用C编写)。 从本质上讲,这就是系统引导的方式。
好的,上一段听起来很抽象而且很简单,我可能错过了一些内容,但是总的来说就是这样。
希望这可以帮助,最好的祝福,汤姆