从启动跟踪指令执行

时间:2017-05-15 06:34:12

标签: assembly x86 x86-16 bootloader

我有一个梦想来编程我自己的操作系统。虽然这可能永远不会实现,但我认为至少朝着这个目标努力可能是有趣和有教育意义的。而且我认为最好的方法是先弄清楚自己的电脑是做什么的。为此,我已经下载了程序RW-Everything,它显示了内存中的内容,以及AMD处理器程序员参考手册(共5册)。从本质上讲,我的问题是RW-Everything所说的我的电脑所做的事情似乎与手册所说的应该完成的事情相符。所以我想知道是谁或者出了什么问题。

根据手册,处理器从FFFFFFF0开始。这里的说明是

90(nop) 90(nop) E9 23 F6(jmp接近-09DD)进入FFFFFFF5 - 9DD = FFFFF618

现在在FFFFF618,说明是 FA(cli) 30 C0(xor al,al) E6 80(80后,al) 66 8B E0(mov esp,eax) 66 8B EA(mov ebp,edx) 66 BB 80 FD FF FF(mov ebx,FFFFFD80) 66 2E 0F 01 17(lgdt cs:[edi])

现在的问题是cs基地址仍然处于其初始值FFFF0000,并且edi仍然处于其初始值0.因此GDTR应该从FFFF0000开始加载6个字节。但是在这个位置是FF的海洋,意味着GDT基地址被设置为FFFFFFFF,这是开始GDT的极不可能的地址。那么...给出了什么?我在某个地方犯了错误吗?

1 个答案:

答案 0 :(得分:1)

您在FFFFF618h进行了反汇编并找到了这些说明:

FA                (cli)
30 C0             (xor al, al)
E6 80             (out 80, al)
66 8B E0          (mov esp, eax)
66 8B EA          (mov ebp, edx)
66 BB 80 FD FF FF (mov ebx, FFFFFD80)
66 2E 0F 01 17    (lgdt cs:[edi])
  

我在某处犯了错误吗?

你的最后一行是错误的。因为在执行时CPU仍然在实地址模式下运行,并且指令没有使用显式地址大小前缀(字节67h)进行编码,正确的转换是:

lgdt [cs:bx]   ;An R/M field of 111 denotes [BX] in 16-bit addressing.

现在BX寄存器初始化为0FD80h,所以你应该看看那里!