无法获得16位汇编程序跳转到0x1000:0x0000

时间:2012-06-22 22:19:42

标签: assembly x86 x86-16 bootloader

我知道我已成功使用int 13h将代码写入该地址,因为我可以在该内存位置看到它。我不能做的就是跳到那里。

我将0x1000(三个零)放入es0x0000放入bx,我知道[es:bx]表示{{1}计算的地址它等于(es * 0x10) + bx(那里有四个零)。但是0x10000,指令指针,永远不会去那里。

我尝试了eipjmp [es:bx]以及jmp 0x1000:0x0000甚至不接受的一堆其他排列。

我目前的启动加载程序(仍然无效)是here。我在Qemu启动它并在NASM的前50个字节上做了一个memsave,用tweak打开它,然后看到我的“内核”代码(简单。但是0x10000仍然拒绝{ {1}},或者到达它然后挂在我想要的地方,就是我的意思)。情况的完整图像here

2 个答案:

答案 0 :(得分:2)

远跳不能使用只为段使用内存位置。您可以通过以下几种方式进行操作:

1)段和偏移的简单硬编码地址。

jmp 0x1000:0

2)使用完整地址进行间接跳转:

entry dw 0x0000 ; offset
      dw 0x1000 ; segment

jmp far dword ptr [entry] ; far jump (syntax might differ)

3)远回报

push SYSADDR ; segment
push 0       ; offset
retf         ; far return

在DOS时间使用的一个常见技巧是修补内容:

  mov ax, SYSADDR
  mov word ptr [myjump+3], ax
myjump:
  jmp 0x0000:0x0000

或将其中一部分用作变量:

myjump:
  db 0xEA           ; far jmp opcode 
  dw 0x0000         ; offset part
  SYSADDR dw 0x1000 ; segment part

免责声明:所有上述内容都来自内存,我可能会遇到一些错误(例如,段/偏移的顺序非常混乱)。

答案 1 :(得分:0)

你应该能够完全按照自己的意愿行事。这是一个做同样事情的例子,大概是出于同样的原因:

; http://www.free2code.net/tutorials/view/writing_your_own_operating_system-12/page1.html
...
mov bx,0x1000  ;Es and Bx put together are where to load the program too 
               ; (see jmp x1000:0x00)
mov es,bx
mov bx,0x00
int 13h        ;Int 13 is all functions for disks
...