🐕‍🦺

【30days自作OS開発記録】2日目-Part1:アセンブリって結局何?

2024/06/11に公開

はじめに

こんにちは!タクーシュだワン!

さて、ここ最近のXを見ると挨拶するしないの論争が繰り広げられているようだけど、そんなものは礼儀礼節としてやっておいて損はないからきちんとやっておくのだ。

もしくは、エンジニアだったらサクッと環境構築をやって「Hello, World」を出力させて挨拶をかますくらいのことは積極的にやっていくのだワン。

さて、先日執筆した以下の1日目の記事において 「アセンブラ」 というキーワードが出てきたのだが、もしかしたらこの言葉を聞いたことがないどころか、全く知らないという人もいるかと思うので、それを見ていきながら実践的に学ぶとしようぞ。
https://zenn.dev/taku_philoso32/articles/41b2df7cae7393

機械語(マシン語)を知ろう

さて、アセンブリを学ぶにあたりそれを理解するために必要な機械語(マシン語)を学ぶ必要があるわけだが、それで 「何でローランドの画像なんか出すんだ?」 と思った人もいるだろう。なぜかって?その方が理解しやすいからだ。

先ほど出した1日目の記事でCPUに関する解説を行ったと思うが、CPUは基本的に0か1の数字を用いることでしか計算処理を行わない訳だが、まさにこの処理がローランドが呼吸のように言っている俺か俺以外かに似ていると思うだろ?

メタ的に言うなら、コンピュータの中には数人ものローランドがいて、俺か俺以外かで言葉を吐き出してる訳よ。

話を戻すと、この0と1を用いた計算によって僕らが書くプログラムコードをCPUを用いて行ってくれるわけだが、コンピュータにとって理解しやすいものであるんだけど、我々人間にとっては原理を知っている人でなければ理解できない領域なのよね。

なので、次に紹介する高級言語という一般的に我々がプログラミング言語と呼ぶものが必要になるのだワン!!

高級言語について知ろう

では、次に低レイヤの機械語(マシン語)から見た時の高級言語とは何かについて紹介するワン。

写真のイメージの通り、エンジニアをやっている者であれば一般的にプログラミング言語と言われる高級言語に触れている訳だが、この高級言語は英語をベースにアルゴリズムに従って記述しなければ動かないんだけど、基本的にはそのプログラム処理自体は我々人間にとって理解しやすいものになってる訳よね。

C、C++、C#、Java、Python、JavaScriptなど我々が一般的に扱うプログラミング言語は高級言語と呼ばれる訳です。(とはいえ、高級言語でも各言語によってコンパイル言語やスクリプト言語など種類は分かれているが。。。)

これらの言語を用いることで、開発速度が向上したり、プログラムの可読性が高くなるなどエンジニアにとって仕事しやすい環境を作ってくれるものになるのです。

とはいえ、マシン語と高級言語のやり取りだけではコンピュータの処理を行うことは出来ないのです。なぜかって、人間にとって理解しやすい言葉と機械が理解し処理できる言葉はかなりかけ離れている訳なんだから。

アセンブラの役割

先ほど、マシン語と高級言語は全く性質が遠い言語として全くやり取り出来ないという話があったと思うんだけど、その仲介役を果たし高級言語かを翻訳しマシン語へ処理を渡すものがある。それがアセンブラというものだワン。

こいつがあることにより、我々は高級言語での処理を書くだけでプログラム処理を実行することが出来る訳で、高級言語からの処理を上手に2進数で処理できるようにうまいこと翻訳してCPUに処理を渡してくれる中継役をやってくれるのだ。

そして、先日の記事でそのサンプルとなるソースコードを公開したわけだが、そこで出てきた処理で主に使われるのは以下の通りだワン。

アセンブラ用語

命令コマンド

DB : ファイルの内容を1バイトだけ直接書く命令
TIMES : TIMES 10 で10回分繰り返しを行う命令
DW : ファイルの内容を2バイトだけ直接書く命令
DD : ファイルの内容を4バイトだけ直接書く命令
$ : 先頭から何バイトか示す変数
JMP : メモリの番地かラベルまでジャンプする
MOV : MOV SS,AXSS = AX と同等の作用

ゆかいなレジスタたち

16ビットレジスタ

  • AX : アキュムレータ(累積計算機という意味)
  • CX : カウンタ(数を数える機械という意味)
  • DX : データ(データという意味)
  • BX : ベース(土台とか基点という意味)
  • SP : スタックポインタ(スタック用ポインタ)
  • BP : ベースポインタ(ベース用ポインタ)
  • SI : ソースインデックス(読み込みインデックス)
  • DI : ディスティネーションインデックス(書き込みインデックス)

8ビットレジスタ

  • AL : アキュムレータロウ
  • CL : カウンタロウ
  • DL : データロウ
  • BL : ベースロウ
  • AH : アキュムレータハイ
  • CH : カスタムハイ
  • DH : データハイ
  • BH : ベースハイ

これらのレジスタは滅多に知ることが出来ないので知らない人もいると思うけど、実はCPUは当時8ビットで動いていた時に拡張で16ビットのレジスタが存在していた時代があった名残で、「X」がそれに当たるものだったワン。

最後に

今回の記事で少しでもアセンブラに関する知識に興味を持ってくれたのなら僕としても嬉しいし、その魅力を伝えただけでも意義があったワン。

しかし、アセンブラとQEMUコマンドだけでOS開発するのはしんどいので、次回はバッチファイルよりも優れたビルドファイルについてPart2で実践的に解説するワン。

To be continued...

Discussion