【发布时间】:2012-06-22 22:19:42
【问题描述】:
我知道我成功地使用int 13h 将代码写入该地址,因为我可以在该内存位置看到它。我不能做的就是跳到那里。
我将0x1000(那里三个零)放入es 和0x0000 放入bx,我知道[es:bx] 表示由(es * 0x10) + bx 计算的地址,它等于0x10000(那里四个零)。但是指令指针eip 永远不会去那里。
我已经尝试过jmp [es:bx]、jmp 0x1000:0x0000 以及NASM 甚至不接受的许多其他排列。
我目前的引导加载程序(仍然无法工作)是here。我在 Qemu 中启动它并在 0x10000 的前 50 个字节上做了一个 memsave,通过调整打开它,并在那里看到了我的“内核”代码(简单。但 EIP 仍然拒绝成为 0x10000,或者到达它然后挂在我想要的地方,这就是我的意思)。全图情况here
【问题讨论】:
-
编辑我的错,你提供了代码。
-
在 16 位程序中设置 EIP 会很困难,这是一个 32 位寄存器。跳转后IP的值为0。
-
@Pete -
jmp [es:bx]将间接跳转到存储在[es:bx]的地址。但是,jmp seg:offset或jmp far seg:offset应该可以工作。而且,就像 Hans 所说,在 0x1000:0 处,您将拥有CS=0x1000和IP=0。
标签: assembly x86 x86-16 bootloader