2013-08-01 71 views
0

我正嘗試在x86上使用直接二進制操作碼來編寫一個簡單的pass by bootloader。如何使用機器碼本身來計算機器指令的偏移量?

我已經將所有裝配體肺炎圖映射到它們各自的二進制前綴/主操作碼,而不是十六進制。

我知道類似這樣的另一個問題有了答案說你必須計算數據的偏移被用作操作數指令,比如說,將數據移動到一個寄存器指向一個視頻模式地址寫直接在實模式下模擬/屏幕/文本模式。

但是,我不明白這一點。我如何計算這樣的偏移量?

+0

你需要計算偏移的唯一時間是當指令指的是自己(即'jmp'指令)。無論指令位於何處,對絕對地址的引用都可以工作。 –

+0

請顯示您正在嘗試搬遷的說明的一些示例。 –

回答

0

一般來說,機器語言指令集使用三種類型的存儲地址的:其是指所關注的確切存儲位置

  1. 絕對地址。
  2. 基地相對地址,當添加到「基址寄存器」的內容時,引用感興趣的存儲位置。
  3. 指令相關地址,當添加到包含它們的指令的地址時,指向感興趣的存儲位置。

通常第三種類型不需要「重定位」,因爲被引用的位置通常與引用指令位於相同的代碼段中,因此它們一起移動。

第二種類型在綁定/加載時可能需要或不需要更改,具體取決於編譯代碼綁定方案的細節。

第一種類型的幾乎總是需要改變,但它通常不是指令本身內,但在從使用所述另外兩個模式中的一個的指令稱爲一個單獨的存儲字。

+0

第一種類型並不總是必須改變的 - 如果你指的是地址0xb8000,那麼指令編碼的指令不會改變,不管指令的位置在哪裏。它只需要改變它是否涉及代碼中的某些內容。 –

相關問題