MS-DOS 可执行文件的 [mov] 指令在入口点动态重定位

MS-DOS executable's [mov] instruction dynamic relocating at entry point

我在 IDA 中反汇编了一个 MS-DOS 可执行文件(16 位),入口点的第一条指令是

mov ax, 0x1000 ;  B8 00 10

但是dump raw hex时对应的字段是

mov ax, 0x0000 ;  B8 00 00

加载程序后是否发生动态重定位?

Realmode executable 文件链接到线性地址 0,就好像整个兆字节的内存都是它们的。当然不是,地址0有256字节的中断table,后面是BIOS数据区,常驻程序等
当程序加载器分配可用内存时,它会知道 image base,即起始线性地址。然后它将EXE文件的内容加载到这个内存中,并查看MZ header中的重定位table。 table 是一个 FAR 指针数组,指向现在加载到内存中的 WORDS,需要由图像库提升。在 this EXE description 中是名为 EXE_RELOC 的 table。

是的,入口指令mov ax, @data被汇编并链接为mov ax,0但是其主体中的立即数0被标记为在加载时重新定位。加载程序后,我们可以在调试器中看到重定位的值。