什么是 8086 可重定位?

ger*_*rit 6 binary-files

我跑了一些Fortran语言软件(LBLRTM)和一个shell脚本,准备输入生成许多文件与名称TAPE3TAPE4等等。出于调试目的,我以前file来识别文件类型。file告诉我:

TAPE3:  8086 relocatable (Microsoft)
Run Code Online (Sandbox Code Playgroud)

我的猜测是file这里是错误的,它只是一个二进制文件,恰好看起来像8086 relocatable. 但是,什么一个8086 relocatable

Red*_*ick 5

我认为可重定位代码早于虚拟内存 (VM)。另一种方法是绝对代码,它必须加载到物理内存中的特定位置(例如,因为它包含以物理地址作为目标的“跳转”指令)

8086 向后兼容旧处理器,旧处理器只能使用 16 位地址寄存器寻址 64KB 内存。8086 也有 16 位段寄存器,这些寄存器被考虑在内(例如,在执行跳转指令时)基本上是真实地址 = 地址 + 段<<4。这允许(可重定位)程序位于与 16 字节“段落”边界对齐的 1MB 内存中的任何位置(上面计算中的 4 位移位)。此类程序只能寻址64KB。显然,操作系统在上下文切换时适当地更改了段寄存器。

很明显,如果你的程序操作了段寄存器,也许它可以使用超过 64 KB 的内存,它不能以这种方式重定位。

Intel 8086/8088 程序有时是可重定位的,或者更准确地说,是位置无关的,如果它们不尝试操作段寄存器的话。在这种情况下,操作系统可以在 16 字节边界上的可用内存中的任何位置加载程序,相应地设置段寄存器,程序将正确运行。然而,在这种模式下,程序只能访问四个 64KB 的内存段。

还可以独立于位置并访问程序的更多内存,采用将所有段操作偏置到程序启动时存在的初始值的方法。

请注意,此讨论未考虑加载模块格式本身是可重定位的,需要加载器重定位的可能性。这是第三种可能性。

来自http://wiki.answers.com/Q/Why_are_8086_programs_called_relocatble_programs

8086 目标模块格式允许指定可相互链接的可重定位内存 imaq。提供的功能允许有效使用 8086 微处理器的内存映射设施。

8086 可重定位对象模块格式
英特尔技术规范

http://en.wikipedia.org/wiki/Intel_8086#Segmentation