2

int 13hそのメモリ位置でコードを確認できるため、を使用してそのアドレスにコードを書き込むことに成功したことはわかっています。私ができないのはそこにジャンプすることです。

私は0x1000(そこに3つのゼロ)を入れes0x0000入れました、そしてそれはそれによって計算されたアドレスが等しい(そこに4つのゼロ)ことを意味するbxことを知っています。しかし、命令ポインタは決してそこに行きません。[es:bx](es * 0x10) + bx0x10000eip

私は、、、および受け入れさえしない他の多くjmp [es:bx]jmp 0x1000:0x0000順列を試しました。NASM

現在の私のブートローダー(まだ機能していません)はここにあります。私はそれをQemuで起動し、最初の50バイトでmemsaveを実行し、0x10000微調整して開き、そこで私の「カーネル」コードを確認しました(単純です。しかし、EIPそれでも拒否するか0x10000、到達してから、必要な場所にハングアップします。 、私が言っていることです)。ここに状況の完全な画像

4

2 に答える 2

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

免責事項:上記のすべてはメモリからのものであり、いくつかの部分が間違っている可能性があります(たとえば、セグメント/オフセットの順序は非常に混乱していました)。

于 2012-06-25T13:53:01.083 に答える
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
...
于 2012-06-22T22:27:58.683 に答える