vis*_*oad 1 x86 assembly bochs
我在 bochs 中调试引导扇区时遇到了几个问题。
在 bochs 中调试引导扇区时,bochs 调试器首先在
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0
Run Code Online (Sandbox Code Playgroud)
Q1:这条指令jmpf 0xf000:e05b是这最后16字节内存中的跳转指令吗?
Q2: address 中有什么指令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
Run Code Online (Sandbox Code Playgroud)
这些代码行由jmpi go,#0x7c00 go: move ax,cx.
Q3:指令jmpi翻译成jmpf机器码ea,对吗?
Q4:0x0005 是标签 go 的偏移量。这个偏移是什么时候计算的?在链接时?
ea0500c007是jmpf的机器码。ea 是指令, 07c0:0005 是操作数(因为 x86 是小端)。此代码为 5 个字节。
Q5:CPU如何读取这条指令,PC如何计算这条指令的大小?CPU 是否遇到 ea 然后读取接下来的 4 个字节作为其操作数?
Q1-Q2。是的,这是重置后 cpu 开始执行的位置。跳转到 BIOS 启动代码的是 ROM 中的代码。
Q3。不知道是什么jmpi,没有这样的指令。它可能是在别处定义的宏。它似乎产生了一个很远的跳跃。
第 4 季度。如果它在同一个模块中,汇编器可能会为你计算出来。在更一般的情况下,链接器会这样做。
Q5. 是的,cpu 解码操作码字节以找出它需要获取的操作数。当它看到ea它时,它知道使用接下来的 4 个字节作为跳转的目标(在 16 位模式下)。
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |