在调试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字节。
问题5:CPU如何读取此指令,PC如何计算此指令的大小?CPU是否遇到ea,然后读取接下来的4个字节作为其操作数
Q1-Q2。是的,那是重置后cpu开始执行的位置。是ROM中的代码跳转到BIOS启动代码。
Q3.不知道jmpi
是什么,没有这样的指令。它可能是在其他地方定义的宏。它似乎产生了一个跳跃。
Q4.如果它在同一个模块中,汇编程序可能会为您计算出。在更常见的情况下,链接器会执行此操作。
问题5.是的,cpu对操作码字节进行解码,以确定需要获取哪些操作数。当它看到ea
时,它知道使用接下来的4个字节作为跳跃的目标(在16位模式中(。