こんにちは、くまごろーです。
次回のLT会で、英語LTをやることになったんですが、そのテーマに「アセンブリ言語」を選ぶことにしました。
名前は有名ですが、Javaですらレガシーと言われている今、駆け出しエンジニアでわざわざこの言語を学ぶ人は少ないんじゃないでしょうか。
私も学んだことは一切ないのですが、数か月前『コンピュータはなぜ動くのか』を読んで、マイコンとアセンブリ言語にかなり興味をそそられたんですよね。
コードを書く、とまではいかなくても、「どんな言語なのか」「どういう特徴があるのか」「Java等の言語と何が違うのか」くらいは知っておきたいなと思ったので、今回テーマに選びました。
いきなり英語でスライド書くのは億劫なので、とりあえず日本語でまとめてみることにします。今度のLT会に参加される方で、ネタバレは嫌ですという方は見ないようにしていただけるとありがたいです・・・(-_-;)
※ちなみに、前述の書籍はこちら↓
www.amazon.co.jp
1 一言でいうと
機械語(CPUが直接理解、実行できる言語。「1」と「0」のみで構成される)をほぼ1対1で文字に変換したもので、最も機械語に近い言語。C,Java等、人間の解釈に近い「高水準言語」に対して、「低水準言語」と呼ばれている。
2 アセンブリ言語を理解するのに必要なキーワード・特徴
(1)「ニーモニック」
「ニーモニック」とは、機械語の命令に、人間が理解わかりやすいように名づけられた、英数字の短い符号のことをいう。機械の動作・命令へのニックネームのようなもの。機械語での命令は、「100010100...」の様に、「1」と「0」の連続なので、人間が暗記して使用するのは難しい。それをなんとかするためにニーモニックが用いられている。
(2)「ラベル」
「アドレス」を指定するために用いる変数のようなもの。(ラベルを用いることで、プログラマーがアドレス番号をその都度指定しなくて済む)
(3)「オペコード」
機械語で表された命令文。(ビット列で記載されている)わかりやすいように「ニーモニック」と紐づけされている
(4)「オペランド」
命令が操作する値や対象(メモリの番地等)を指す。オペコードとオペランドの組み合わせで一つの命令が構成される。
※ CPUによって言語が異なる
「ニーモニック」がCPUによって異なるので、全てのCPUを同じ言語で扱うことはできないらしい。
3 コード例
ちょっと調べてみて、簡単なコードを探してきました。
ちなみに、今回のコードはCASLⅡというものらしい。
<ニーモニック一例>
- MOV(move):コピーする
- LD(load):メモリからロードする
- ST(store):レジスタからメモリへコピーする
- ADDA(add):加算
- SUBA(subtract):減算
参考:アセンブラプログラミングを徹底解説!その特徴から役割、C言語との関係性まで分かりやすく解説します。 | Geekly Media
下記は「20+30」の計算を行うコード。
ST 10, 20 ST 11, 30 LD 10 ADDA 10, 11 OUT END
一行ずつ解体していくと・・・
(1)メモリ10番地に、「20」を格納
ST 10, 20
(2)メモリ11番地に、「30」を格納
ST 11, 30
(3)メモリ10番地のデータを読み込む
LD 10
(4)メモリ11番地のデータを加算する
ADDA 10, 11
(5)出力・終了
OUT END
ちなみに、これをJavaでやると(というか他の言語もだけど)一行で終わる。
System.out.println(20 + 30);
コンピュータは内部でこんなに面倒な手順を踏んでいたのか・・・(-_-;)
4 条件分岐(if文・for文等)はどうなるの?
アセンブリ言語では、他の言語では一般的な「if文」「for文」「switch文」等に直接対応するものはないみたい。ただし、前述の「ラベル」を使用した「ジャンプ」や、フラグレジスタを使用した条件判定を使って、条件分岐を実現しているらしい・・・
(1)「ジャンプ」
今いる命令のアドレスから、指定されたアドレス(もしくはラベル)に移動すること
<例>
ST 10, 20 ST 11, 30 LD 10 LOOP ADDA 10, 11 //LOOP・・・フラグ OUT JUMP LOOP END
JUMP LOOP
の部分で、LOOPフラグの付加された行に文字通りジャンプすることになります。
上記コードだと、無限ループになります。
(2)「フラグレジスタ」
フラグレジスタは、0か1を格納するレジスタで、CPUの状態を0 or 1で表します。フロー制御などの判断材料などに用いるとのこと。
これら↑使用して、条件分岐を発生させるらしい・・・(-_-;)
手順を文章で説明すると、
(1)条件判定用のニーモニックで分岐の是非を始めに判定、フラグレジスタにステータスフラグをセット
(2)ステータスフラグに基づき、ジャンプするかどうかを判定する
といった感じ。
ちょっと、これに関してコードを提示して説明できるレベルではなかったので、リンクを張らせてもらいます。
このページの説明が、アセンブリ言語知識ゼロな人間にとっては一番理解しやすかったです。
wisdom.sakura.ne.jp
5 「アセンブリ」「アセンブラ」「アセンブル」何が違う?
アセンブリ言語について調べていると「アセンブリ」とか「アセンブラ」とか出てきて「どれが正しいの?」状態になります。
これらはタイプミスでもなんでもなくて、全部違うものを指しているらしい。
6 参考