在学校里,我们一直使用Bootstrap程序来运行独立的程序,而不需要操作系统。我一直在研究这个程序,当保护模式启用时,会通过直接组合操作码和操作数作为程序内的数据执行far跳转。这是针对GNU汇编器的:
/* this code immediately follows the setting of the PE flag in CR0 */
.byte 0x66, 0xEA
.long TARGET_ADDRESS
.word 0x0010 /* descriptor #2, GDT, RPL=0 */
首先,为什么有人想这样做(而不是使用指令助记符)?
我一直在查看英特尔手册,但仍对代码感到有些困惑。具体来说,在第2A卷的第3-549页中,有一个操作码表。相关条目如下:
EA *cp* JMP ptr16:32 Inv. Valid Jump far, absolute, address given in operand
实际的操作码很明显,但第一个字节0x66让我感到困惑。参考英特尔手册中的表格,cp显然表示接下来会有6个字节的操作数。显然,在接下来的两行中,会有6个字节跟随。0x66编码为“操作数大小覆盖前缀”。这与表格中的cp有什么关系呢?我原以为cp会有一些十六进制值,但实际上是这个覆盖前缀。请问有人能帮我澄清一下吗?
以下是od的转储:
c022 **ea66 0000 0001 0010** ba52 03f2 c030
TARGET_ADDRESS定义为0x00010000。
我也有点困惑最后两个字节的意义。但那似乎是另一个问题了。现在已经很晚了,我已经盯着代码和英特尔手册几个小时了,希望我能表达清楚我的观点。
谢谢!