【发布时间】:2015-11-05 14:47:58
【问题描述】:
我在 bochs 中调试引导扇区时遇到了几个问题。
在 bochs 中调试引导扇区时,bochs 调试器首先暂停
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0
Q1:这条指令jmpf 0xf000:e05b是这最后16字节内存中的跳转指令吗?
Q2:地址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
这些代码行由jmpi go,#0x7c00 go: move ax,cx生成。
Q3:指令jmpi翻译成jmpf和机器码ea,对吗?
Q4:0x0005是标签go的偏移量。这个偏移量是什么时候计算的?在链接时?
ea0500c007 是 jmpf 的机器码。 ea 是指令,07c0:0005 是操作数(因为 x86 是 litten endian)。此代码为 5 个字节。
Q5:CPU如何读取这条指令,PC如何计算这条指令的大小? CPU会遇到ea然后读取接下来的4个字节作为它的操作数吗?
【问题讨论】: