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,根据窗口是否可写而定。 |