【问题标题】:Debug Boot Sector in Bochs how jmpi works and cpu calculate the instruction address在 Bochs 中调试引导扇区 jmpi 如何工作以及 cpu 计算指令地址
【发布时间】: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个字节作为它的操作数吗?

【问题讨论】:

    标签: assembly x86 bochs


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多