見出し画像

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のプロジェクト・ニュースに衝撃が走ります。

画像1  

 ぬわぁんと!TK Chia氏の尽力により、DOS環境に特化した、i8086版GCCの移植作業が進められているというのです🙀。マヂかよ・・(胸熱💦)。

画像2

 そして、翌年にはi8086版GNU開発ツール一式と、DOS版16ビットライブラリーがめでたく整備されたのです〜〜〜👏。

画像3

 現在、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環境と開発環境が揃ったのでありました😻。フリーソフト万歳🎉。

いいなと思ったら応援しよう!