FreeDOSとi8086版GCC
1981年に発売されたIBM-PCは、CPUとして"Intelプロセッサ i8088"を搭載していました。i8088は、i8086のデータバス8ビット版ですから(i8086のデータバスは16ビット)、IBM-PCアーキテクチャを理解するためには、i8086の知識が必要になるのです。
そして、このIBM-PCに搭載されていたOSが"PC DOS"であり、これはビルゲイツ率いる当時生まれたばかりのMicrosoft社が開発した「MS-DOSのIBM-PC版OEM製品」。
ですから、IBM-PCを味わうためには、i8086とMS-DOSの知識が必要になります。MS-DOSは、もはやその役目を終えたとはいえ、Microsoft社の商品ですから、勝手にコピーして配布する訳にはいきません。幸いなことに『FreeDOS』という神プロジェクトが、配布自由なDOS互換OSと関連ツールを開発し、公開してくれていますので、私達はその成果を有り難く使わせて頂きましょう🙇。
OS環境が揃えば、次にIBM-PCアーキテクチャを学ぶためには、MS-DOS上で動くプログラムを作成しなければなりません。
現代は、FSF (Free Sotware Foundation)の尽力により、GNU開発環境が充実していますが、残念ながら、これまでGNUがサポートしてきたインテル・アーキテクチャは32ビット版と64ビット版のみでした。今の時代、古い16ビット版のコード出力は必要ないため、当初からGCCは16ビット版をサポートしていなかったのです。
ところが・・
DOS環境用に用意された16ビット版GCC
2018年8月、FreeDOSのプロジェクト・ニュースに衝撃が走ります。
ぬわぁんと!TK Chia氏の尽力により、DOS環境に特化した、i8086版GCCの移植作業が進められているというのです🙀。マヂかよ・・(胸熱💦)。
そして、翌年にはi8086版GNU開発ツール一式と、DOS版16ビットライブラリーがめでたく整備されたのです〜〜〜👏。
現在、TK Chia氏による16ビットDOS版GCC(IA16-GCC)の整備は、GitHub (gcc-ia16)上にて精力的に進められております。
hello.c が i8086のコードに変身!
で、早速オジサンもUbuntu上で、その成果を確認してみました。まずは、お決まりの hello.c を用意。
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 123;
}
次に、IA16-GCC でこのCソースをコンパイルし、アセンブリソースを出力(gccの-Sオプションに注目)。
$ ia16-elf-gcc -S hello.c
$ cat hello.s
.arch i8086,jumps
.code16
.att_syntax prefix
#NO_APP
.section .rodata
.LC0:
.string "Hello world!"
.text
.global main
.type main, @function
main:
pushw %bp
movw %sp, %bp
movw $.LC0, %ax
pushw %ax
pushw %ss
popw %ds
call puts
addw $2, %sp
movw $123, %ax
movw %ax, %ax
movw %ax, %ax
movw %bp, %sp
popw %bp
お〜〜〜、確かに昔懐かしの i8086 アセンブリソースが出力されておりまする〜〜〜!!オジサン、感涙😭。ちなみに、GCCが出力するアセンブリソースは、標準的なIntel形式ではなく、AT&T形式なので、別途お勉強をする必要があります。
ということで、この度めでたく『IBM-PCアーキテクチャ学習』のための、OS環境と開発環境が揃ったのでありました😻。フリーソフト万歳🎉。