Oberon/ETH Oberon/InitStrings
Q.: Init="b8024fbb1441cd10b8014fb91401cd10268b4d28268b552a" 這樣的行是什麼意思?這種行會在啟動初期與其他配置字串一起出現?
A.: 其實並不難理解。這個字串是機器程式碼,它會在處理器從真實模式切換到保護模式、V86 模式或長模式之前被解釋。這是一種簡單直接的方法,透過設定暫存器、寫入低記憶體設定區域和進行 BIOS 呼叫來配置顯示器。
當系統安裝了 Oberon0 時,Config.Mod 會提供一個 Init 字串。然後,無論何時啟動系統,引導載入程式都會允許使用者更改該字串。
要理解一個特定的字串,可以使用反彙編器。然後,在 Google 上搜索以瞭解影片處理器是如何工作的。關於VESA 2.0 和VESA 3.0 的規格可以以 PDF 檔案的形式獲得。
從最簡單的例子開始,Init="b81200cd10"。以下三種方法可以反彙編 Init 字串。
1) 你可以線上使用這個基於 Web 的反彙編器:https://www.onlinedisassembler.com/odaweb/。在 "Arch" 中選擇 "i8086"(處理器處於真實模式),並將 Init 字串的十六進位制位元組貼上到平臺設定下面的視窗中。在右側找到反彙編程式碼。
.data:00000000 b81200 mov $0x12,%ax .data:00000003 cd10 int $0x10
2) 我們需要一個包含這些位元組的 Init.o 檔案。一個顯而易見但效率不高的方法是使用 Edit 或 ET 在 Init.o 中放入任何 5 個字元。然後,使用 Hex.Open 開啟 Init.o,將這些字元替換為 B8 12 00 CD 10,並儲存。將 Init.o 移動到 Linux 系統。在那裡,應用 objdump。
objdump -b binary -m i8086 -D Init.o Init.o: file format binary Disassembly of section .data: 0000000000000000 <.data>: 0: b8 12 00 mov $0x12,%ax 3: cd 10 int $0x10
3) Kees C. 建議使用 libdisasm x86dis 工具。
$ echo -e '\xb8\x12\x00\xcd\x10' | x86dis -r 0 5 -s att 00000000 B8 12 00 mov $0x0012, %ax 00000003 CD 10 int $0x10
每種方法都可以應用於任何字串。
| 機器程式碼 | 操作 | 運算元 | 解釋 |
|---|---|---|---|
| b81200 | mov | $0x12,%ax | 將 12h 放入暫存器 ax 中 |
| cd10 | int | $0x10 | 根據 ax 的內容,[1] 影片 BIOS 中斷呼叫將設定 640 x 480 畫素 x 24 色。 [2] |
| 機器程式碼 | 操作 | 運算元 | 解釋 |
|---|---|---|---|
| b8024f | mov | $0x4f02,%ax | 將 4f02H 放入暫存器 ax 中。 |
| bb1441 | mov | $0x4114,%bx | 將 4114H 放入暫存器 bx 中。 |
| cd10 | int | $0x10 | 對於 ax 和 bx 中的這些值,影片 BIOS 將設定 800 x 600 畫素 x ?? 色。 |
| b8014f | mov | $0x4f01,%ax | 將 4f01H 放入 ax 中。 |
| b91401 | mov | $0x114,%cx | 將 114H 放入 cx 中,表示 800 x 600 x 16 位顏色。 |
| cd10 | int | $0x10 | 查詢影片模式。 [3] es:di 包含返回的資訊。 [4] |
| 268b4d28 | mov | %es:0x28(%di),%cx | rWinBAttrs[8] = 0 或 1,根據視窗 A 或 B 是否支援而定。 |
| 268b552a | mov | %es:0x2a(%di),%dx | rWinBAttrs[a] = 1 或 0,根據視窗是否可寫而定。 |