0

我正在尝试使用直接二进制操作码在 x86 上编写一个简单的通过引导加载程序。

我已将所有程序集助记符映射到它们各自的等效二进制前缀/主要操作码,而不是十六进制。

我意识到另一个与此类似的问题有一个答案说您必须计算在指令中用作操作数的数据的偏移量,例如,将数据移动到寄存器并指向视频模式地址以直接写入模拟/实模式下的屏幕/文本模式。

但是,我不明白这一点。我如何计算这样的偏移量?

4

1 回答 1

0

一般来说,机器指令集使用三种类型的存储地址:

  1. 绝对地址,指的是感兴趣的确切存储位置。
  2. 相对于基址的地址,当添加到“基址寄存器”的内容时,指的是感兴趣的存储位置。
  3. 指令相关地址,当添加到包含它们的指令的地址时,指的是感兴趣的存储位置。

通常第三种类型不需要“重定位”,因为被引用的位置通常与引用指令在同一个代码段中,所以它们一起移动。

第二种类型可能需要也可能不需要在绑定/加载时进行更改,具体取决于已编译代码绑定方案的详细信息。

第一种类型几乎总是需要更改,但它通常不在指令本身内,而是在使用其他两种模式之一的指令引用的单独存储字中。

于 2013-08-01T21:32:53.620 回答