如何使用机器代码本身计算机器指令的偏移量?

时间:2013-08-01 21:01:41

标签: assembly x86 machine-code

我正在尝试使用直接二进制操作码在x86上通过pass bootloader写一个简单的传递。

我已经将所有的组装mneumonics映射到它们各自的,等效的二进制前缀/二进制的主要操作码,而不是十六进制。

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

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

1 个答案:

答案 0 :(得分:0)

通常,机器指令集使用三种类型的存储地址:

  1. 绝对地址,指的是感兴趣的确切存储位置。
  2. 基本相对地址,当添加到“基本寄存器”的内容时,指的是感兴趣的存储位置。
  3. 指令相关地址,当添加到包含它们的指令的地址时,指的是感兴趣的存储位置。
  4. 通常第三种类型不需要“重新定位”,因为被引用的位置通常与引用指令位于相同的代码段中,因此它们一起移动。

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

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