Assembly 从启动开始跟踪指令执行

Assembly 从启动开始跟踪指令执行,assembly,x86,x86-16,bootloader,Assembly,X86,X86 16,Bootloader,我有点白日梦,想编写自己的操作系统。虽然这可能永远不会实现,但我认为至少朝着这个目标努力可能是有趣和有教育意义的。我想最好的办法是先弄清楚我自己的电脑是做什么的。为此,我下载了程序RW Everything,它向我展示了内存中的内容,以及AMD处理器程序员参考手册(全部5卷)。本质上,我的问题是,RW Everything所说的我的计算机所做的似乎与手册所说的应该做的不匹配。所以我想知道是谁出了什么问题 根据手册,处理器在FFFFFFF 0处启动。这里的说明是 90(无) 90(无) E9 23

我有点白日梦,想编写自己的操作系统。虽然这可能永远不会实现,但我认为至少朝着这个目标努力可能是有趣和有教育意义的。我想最好的办法是先弄清楚我自己的电脑是做什么的。为此,我下载了程序RW Everything,它向我展示了内存中的内容,以及AMD处理器程序员参考手册(全部5卷)。本质上,我的问题是,RW Everything所说的我的计算机所做的似乎与手册所说的应该做的不匹配。所以我想知道是谁出了什么问题

根据手册,处理器在FFFFFFF 0处启动。这里的说明是

90(无) 90(无) E9 23 F6(jmp接近-09DD),它通向FFFFF5-9DD=FFFFF618

现在,在FFFFF618,说明如下 FA(cli) 30 C0(异或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,FFFFF D80) 66 2E 0F 01 17(lgdt cs:[edi])


现在这里的问题是cs基址仍处于其初始值FFFF0000,edi仍处于其初始值0。因此GDTR应该从FFFF0000开始加载6个字节。但在这个位置是一片FF的海洋,这意味着GDT基址被设置为FFFFFF,这是一个极不可能开始GDT的地址。那么…什么给了你?我在什么地方弄错了吗?

您在FFFFF 618H分解后发现了以下说明:

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处初始化,因此您应该查看一下

66 2e 0f 01 17
应解码为
lgdt cs:[bx]
,其上有66前缀,因此操作数被重写为32位宽。这可以确保GDTR中的基指针被视为完整的32位线性地址,而不是32位线性地址,前8位被屏蔽为0,从而有效地使其成为24位线性地址。24位线性地址是286.michaelpetch的保留-我很确定列表中有ax、cx、dx、bx、sp、bp、si、di。最后3位是111意味着它是di。其他人能以这种或那种方式确认吗?另外,我知道它是一个32位指针,这就是为什么我注意到这意味着GDT基址是FFFFFFFF。我的猜测是,在FFFF0000的FF的海洋是没有意义的,并不意味着指向任何东西。我可以补充一点,未来的指令似乎会将处理器切换到保护模式,这在我看来还为时过早。您好,我不确定您是否还在阅读本文,但我只是想对您的回答说声谢谢。我误认为66适用于偏移寄存器的大小。即使纠正了那个错误,我也很难找到111的意思是BX。事实上,如果我仔细阅读手册,我会注意到111=rDI适用于32位和64位寻址。手册没有明确排除16位寻址,我解释了rDI中的“r”来承认这种可能性。我在附录中找到了16位寻址的列表。当然,看看FD80,我发现了一个有效的(如果奇怪的话)GDT。所以我只是想说声谢谢,而不是让你继续认为你的帮助没有被注意到或没有被感激。