前回、コマンドやオプションを駆使して8086V6のa.outを作っていました。
ACKをカスタマイズしてオプションなしで出力できるようになりました。
$ 8086v6-cc -.o write.s $ 7run a.out hello
※ -.oはgccの-nostdlibに相当します。
続きを読む【お知らせ】プログラミング記事の投稿はQiitaに移行しました。
8086版V6のa.outはマジックナンバーで識別することにしました。PDP-11のマジックナンバーはブランチ命令に由来します。
0407(0x107) | br 020(0x10) | .textと.dataは同じセグメントで連続 |
0410(0x108) | br 022(0x12) | .textと.dataは別セグメントに分離 |
0411(0x109) | br 024(0x14) | .textと.dataは別メモリ空間に分離 |
8086で相当する命令をマジックナンバーとしました。
0xeb 0x0e | jmp short 0x10 |
0xeb 0x10 | jmp short 0x12 |
0xeb 0x12 | jmp short 0x14 |
ちなみにV7/x86は32bit化されているため、V7(V6と同じ)のヘッダの各項目を単純に32bit化したフォーマットで、マジックナンバーはPDP-11と同じです。
続きを読むi8086インタプリタにPDP-11インタプリタを統合しました。1つのプログラムでMINIX 2とUNIX V6の両方のバイナリを動かせます。
UNIX V6のccを動かしてカーネルがビルドできることを確認しました。
V6移植ハッカソンで使うため、2年前に作ったPDP-11のインタプリタをi8086インタプリタの構造に合わせて移植しました。MINIX 2とUNIX V6のUNIXとしての共通部分は基底クラスで共用しています。UNIX V6をi8086に移植する際にインタプリタでシステムコールのABIを実装すれば、カーネルを移植する前にユーザーバイナリの動作確認を切り離して行えるのではないかという狙いです。
続きを読む