gasと戦闘中

今、OS自作入門3日目のiplからOS本体に処理を移すところを書いているのだけれど、iplからOS本体に処理が移らない。

具体的には、iplから0xc200番地によみこまれるはずのコードへジャンプしたいのだけれど、ジャンプ先のコードが読み込まれない。

[Using as:title=http://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory]
Absolute (as opposed to PC relative) call and jump operands must be prefixed with `*'. If no `*' is specified, as always chooses PC relative addressing for jump/call labels.

とあるので、これにならって

jmp  *0xc200

としても、0xc200番地に存在するはずのコードが読み込まれない。理由は2つ考えられて、

  1. jmp命令について私が勘違いをしている。
  2. jmp先に実は何もない。IPLを書き間違えていて、jmp自体は成功しているが、その先でわけのわからない(undefined な)命令を実行している。

はたしてどっちかなぁ。前者については、アセンブルしたバイナリをみてみたところ、

0xff 0x26 0x00 0xc2

となっていて、ちゃんと該当するコードが存在したので、大丈夫そう。ってことは、やっぱり2.のiplを書き間違えている可能性が高い。時間はあるからもうちょい頑張ってみるかー。