プロテクトモードで間接的なファージャンプ/コールを実行するにはどうすればよいですか?最初に私はこれを行うことは許容できると考えていました:
jmp 0x10:eax;
(セグメントセレクターについて心配する必要はありません。GDTの2番目のエントリは有効なコードセグメントです)
しかし、nasmがそれを組み立てたとき、それは構文エラーでした。Intel(命令セットリファレンス)マニュアルのBook 2aを見ると、これは、が即値である、またはを使用してのみ実行できますjmp ptr16:32
。ここで、は48ビットジャンプアドレス(16:32)を含むメモリ位置です。 )。ptr16:32
jmp m16:32
m16:32
今、私はそれをこのようにエンコードしようとしました:
mov dword[ds:jumpaddress_offset],eax
; or just dword[jumpaddress_offset],eax
mov word[ds:jumpaddress_sel],0x10;
; or just mov word[ds:jumpaddress_sel],0x10;
jmp dword far [dword ds:jumpaddress];
...
jumpaddress:
jumpaddress_sel dw 0
jumpaddress_offset dd 0
正常にアセンブルされましたが、実行しようとすると、プロセッサが一般保護違反になり、再起動します。何が起こったのかわかりません。
エンコーディングは次のようになっていると思います。
(たとえば、間接ジャンプを使用して0x10:0x8010にジャンプしたい)
dw 0x10
dd 0x8010
これの何が問題になっている可能性がありますか?48ビットメモリ値はリトルエンディアンでコーディングする必要がありますか?そして、それはこのようにコーディングされるべきですか?
;0010 0000 8010
dd 0x10,0x80,0,0,0x10,0
私は最後のものをやろうとはしていません。