调试Bochs中的引导扇区jmpi的工作方式和cpu计算指令地址



在调试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位模式中(。

最新更新