在 Bochs 中调试引导扇区 jmpi 如何工作和 cpu 计算指令地址

vis*_*oad 1 x86 assembly bochs

我在 bochs 中调试引导扇区时遇到了几个问题。

在 bochs 中调试引导扇区时,bochs 调试器首先在

(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b      ; ea5be000f0
Run Code Online (Sandbox Code Playgroud)

Q1:这条指令jmpf 0xf000:e05b是这最后16字节内存中的跳转指令吗?

Q2: address 中有什么指令0xf000:e05b

然后我们想让代码停在地址 0x7c00

<bochs:1> b 0x7c00
<bochs:2> c
(0) Breakpoint 1, 0x0000000000007c00 in ?? ()  
Next at t=61419250
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): jmpf 0x07c0:0005   ; ea0500c007
<bochs:3> s                                   
Next at t=61419251
(0) [0x000000007c05] 07c0:0005 (unk. ctxt): mov ax, cs         ; 8cc8
Run Code Online (Sandbox Code Playgroud)

这些代码行由jmpi go,#0x7c00 go: move ax,cx.

Q3:指令jmpi翻译成jmpf机器码ea,对吗?

Q4:0x0005 是标签 go 的偏移量。这个偏移是什么时候计算的?在链接时?

ea0500c007是jmpf的机器码。ea 是指令, 07c0:0005 是操作数(因为 x86 是小端)。此代码为 5 个字节。

Q5:CPU如何读取这条指令,PC如何计算这条指令的大小?CPU 是否遇到 ea 然后读取接下来的 4 个字节作为其操作数?

Jes*_*ter 5

Q1-Q2。是的,这是重置后 cpu 开始执行的位置。跳转到 BIOS 启动代码的是 ROM 中的代码。

Q3。不知道是什么jmpi,没有这样的指令。它可能是在别处定义的宏。它似乎产生了一个很远的跳跃。

第 4 季度。如果它在同一个模块中,汇编器可能会为你计算出来。在更一般的情况下,链接器会这样做。

Q5. 是的,cpu 解码操作码字节以找出它需要获取的操作数。当它看到ea它时,它知道使用接下来的 4 个字节作为跳转的目标(在 16 位模式下)。