我在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
生成。
问题3:说明jmpi
已翻译为jmpf
和机器代码ea
,是不是?
Q4:0x0005是标签go的偏移量。这个偏移是什么时候计算的?在链接时间?
ea0500c007
是jmpf的机器代码。 ea是指令,07c0:0005是操作数(因为x86是litten endian)。这段代码是5个字节。
问题5:CPU如何读取该指令以及PC如何计算该指令的大小? CPU是否遇到ea然后读取接下来的4个字节作为其操作数?
答案 0 :(得分:4)
Q1-Q2。是的,这是cpu在重置后开始执行的位置。 ROM中的代码跳转到BIOS启动代码。
Q3。不知道jmpi
是什么,没有这样的指示。它可能是其他地方定义的宏。它似乎产生了很大的跳跃。
Q4。汇编程序可能会为您计算出它是否在同一个模块中。在更一般的情况下,链接器会这样做。
Q5。是的,cpu对操作码字节进行解码,以确定需要获取的操作数。当它看到ea
它知道使用接下来的4个字节作为跳转的目标时(在16位模式下)。