ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ






2018-06-01

アセンブリ言語のCASL2 入門







ところで、「アセンブリ言語」をご存知でしょうか?当方は、ハリウッド映画「ターミネーター」を鑑賞し、興味を持ちました。


ターミネーターにて、サイボーグの視点シーンをよく見るとニーモニックと機械語が流れている様子を見ることができます。しかし、その機械語をよく見ると16ビットっぽいんですよね。(笑)


ターミネーターって未来のロボットのはずですが、映画の公開が1984年ですから仕方ないですよね。本記事では、「基本情報技術者」試験に出題される、アセンブリ言語「CASL2」について触れたいと思います。
















なぜ今更アセンブリがおすすめなのか



低級言語アセンブリがおすすめの理由は、他のC言語やJAVAよりも簡単で、事前にCASL2の仕様を把握していれば、試験本番で理解しなければならない内容が少なくて済むことです。


CASL2は、「COMET2」という架空のコンピュータを動作させるために考案されたアセンブリ言語です。


COMET2自体は、「基本情報技術者試験」のためにだけ生み出されたコンピュータであり、コンピュータの動作原理を受験者が理解しているかを見極める程度の代物という認識で問題ありません。


CASL2の文法や仕様を理解していれば、問題自体は単純なものであるため、オススメといえます。


とはいえ、他者によって書かれたプログラムを読めるようになるためには、ある程度の訓練を必要とし、誰しも「何だよこれ簡単じゃねえよ...」という感想を抱くことは言うまでもありません。


しかし、慣れていない段階でプログラムコードを見て理解できないとしても、勉強を続けている内に急に分かる瞬間が訪れるため、頑張って試行錯誤を続けてください。


このように、プログラミングとは、習得に至るまでに乗り越えなくてはならない壁が存在するため、誰でも簡単に行える作業ではないことが分かるでしょう。


すなわち、プログラミングとは一種のスキルであり、能力が身につけばお金を生む代物といえます。








アセンブリを記述する上で必要なこと



CPUは、必ずメモリからデータを一旦「レジスタ」にロードした後に本番の計算を行っています。


レジスタとは、全てのCPUに必ず存在する記憶装置のことで、最高速で動作します。


C言語やJAVAなどの高級言語を扱う上で、コンピュータの動作についてはメモリとの関係を理解しておけば問題ありませんが、アセンブリ言語では以下の4点について留意しておいてください。


  1. メモリにデータを設定
  2. 1. で設定されたデータをレジスタに移動
  3. 足し算、引き算などの計算処理
  4. メモリに計算結果を格納


CPUは、上記の順番で、データを処理しています。したがって、CPUは、レジスタに一旦データをロードしてから作業をする、と覚えておいてください。











レジスタ



レジスタとは、CPUに必ず存在する記憶装置のことですが、COMET2は、以下のような種類のレジスタを備えています。


  1. 汎用レジスタ
  2. フラグレジスタ
  3. プログラムレジスタ
  4. スタックポインタ



汎用レジスタ



汎用レジスタとは、メモリからロードしたデータを一時的に保存しておくレジスタです。


しばしば、レジスタといった場合には、汎用レジスタのことを指しています。


数あるレジスタの中でも、最も頻繁にデータの書き換えが行われ、プログラムを組んでいる内にお馴染みになってくるレジスタです。


COMET2にはGR0~GR7の8つの汎用レジスタが用意されています。


これらの容量は1語です。


※ 1語とは、16ビット(=2バイト)のことです。


ちなみに、このGRというのは「General Resister」の各単語の頭文字だけ繋げたもので、汎用的(何にでも使える)なレジスタという意味になります。



フラグレジスタ



要領3ビットの小さなレジスタで、ZF(ゼロフラグ)、SF(サインフラグ)、およびOF(オーバーフローフラグ)で構成されています。


フラグレジスタは、汎用レジスタとも接続されており、常に汎用レジスタ上での値の変化を監視しているといっても間違いではありません。


CASL2では、足し算や引き算などの計算を行った後に、答えが汎用レジスタに戻されるため、汎用レジスタとフラグレジスタが接続されていることで、適切にフラグを立てることができます。


どのような場合にフラグレジスタは動作するのか、例も併せて見てみましょう。



ゼロフラグ



ゼロフラグは、何らかの計算をした結果がゼロであった場合に1に変わります。


  • ZF(ゼロフラグ) ・・・要領1ビット。計算結果が0のとき1になります。



例1: 引き算の計算をした答えが、0であった場合

【フラグレジスタ】
ZFSFOF
100

ZF(ゼロフラグ)が、1になります。



サインフラグ



サインフラグは、何らかの計算をした結果がマイナス(0未満の数値)であった場合に1に変わります。


  • SF(サインフラグ)・・・要領1ビット。計算結果がマイナスのとき1になります。



例2: 引き算の計算をした答えが、-1であった場合

【フラグレジスタ】
ZFSFOF
010

SF(サインフラグ)が、1になります。



オーバーフローフラグ



オーバーフローフラグは、何らかの計算をした結果が16ビットの容量を超えた(65535以上の数値)であった場合に1に変わります。


  • OF(オーバーフローフラグ) ・・・要領1ビット。計算結果が16ビットの容量を超えた値のとき1になります。



例3: 足し算の計算をした答えが、65536であった場合(16ビットは最大0~65535の範囲でしか数値を表せない)

【フラグレジスタ】
ZFSFOF
001

OF(オーバーフローフラグ)が、1になります。





プログラムレジスタ



別名プログラムカウンタとも呼ばれることがあり、容量は1語です。


専らCOMET2では、「プログラムレジスタ」が正式な呼び名です。


次に読み込むべきプログラムコードが格納されたアドレスを記憶しておくレジスタです。


アセンブリを記述する上では、特に意識しなくてもOKです。



スタックポインタ



CPU内のレジスタ上のデータをメモリ上のスタック領域に退避させるために使われます。


容量は、プログラムレジスタと同じく1語です。


例えば、主プログラムを実行中に、副プログラムを実行しなければならない状態(割り込み処理)が発生したとき、副プログラム実行のために、CPUを使わなければなりません。


しかし、CPUは主プログラムが実行中であり、CPU内の汎用レジスタには主プログラムの値が格納されたままです。


そこで、主プログラムの処理内容を何処かに保存するために、このスタックポインタが活躍します。


主プログラムで使っていた、汎用レジスタ内容を、メモリ上のスタック領域に一旦保存しておきます。


そのときに、スタック領域のどのアドレスにデータを保存していったかを、スタックポインタに保存しておきます。


それから、副プログラムを呼び出して処理が終わると、CPUは、スタックポインタを参照して、主プログラムの内容を各レジスタに戻し、主プログラムの処理を再開します。


このレジスタもアセンブリを記述する上では、特に意識しなくてもOKです。







メモリ





メモリは、主記憶装置のことで、コンピュータが何らかのデータを処理するとき、必ずCPUとはセットで考えなければならない装置です。


COMET2においてメモリの容量は65536語(65536 × 2バイト = 131072バイト)。すなわち、約131キロバイトです。


アドレスは、0~65535番地(0000~FFFF番地)まであります。つまり、1つの番地に1語(16ビット)のデータを格納できるということになります。





以下は余談です。

実際の基本情報技術者午後試験にはあまり関係ない内容のため、この章をスキップする方は以下リンクをクリックしてください。




実は、メモリはそれぞれ用途に応じて特定の領域に区切られ使用されています。この65536語の容量中に、実行するためのプログラムコードを格納したり、スタックとして使用する領域も含まれます。


その領域というのが、「プログラム領域」、「データ領域」、そして「スタック領域」です。


【図1: メモリの3領域】


注意

ググってみると、メモリの4領域の情報を見ることができます。


「データ領域」が、さらに「静的領域」と「ヒープ領域」に分けられますが、CASL2はアセンブリ言語であり、グローバル変数とローカル変数を区別する仕様ではないため、データ領域で統一しても問題ないと考えられます。



プログラム領域



プログラム領域に格納されているデータは全て機械語として扱われます。


プログラマによって組まれたプログラムコードが格納される領域になります。


前述した「プログラムレジスタ」には、プログラム領域のアドレス値が入っているということになります。


【図2: プログラム領域】



例えば、図2上の「LAD GR0, 0」という命令を実行中とすると、プログラムレジスタの値は「1」ということになります(「LAD GR0, 0」は、1番地に格納されているため)。



データ領域



データ領域は、プログラミングするときに値を設定したり、汎用レジスタからデータがロードされる領域です。


プログラミングにおいてスタックを意識的に使用する場合を除いて、メモリといえばデータ領域のことを指していると捉えて差し支えないでしょう。



スタック領域



スタック領域は、データをスタックするために用いる領域です。


スタックを想像するとき、丁度、箱に本を収納するときを考えてください。


一度、収納してしまった本を取り出すとき、最後に入れた本を最初に取り出さないといけませんよね?スタックとはデータをそのような仕組みで取り扱うメモリ上の領域です。


「PUSH」や「POP」などの命令を使用することで、この領域にデータを格納したり取り出したりすることができます。


同命令は、唯一スタックのデータを扱うことのできる命令になります。













文法



文法
ラベルオペコードオペランド
第1第2第3


上記表に示すように記述します。


オペランドとオペコードを区切るのは「スペース(タブも可)」、第1~第3オペランドを区切るのは「, (カンマ)」です。


【文法の例】
  • LD GR0, GR1


高級言語と比べ、数少ないアセンブリ言語の利点を挙げるなら、文法が単純だということがいえます。


ラベル、オペコード、オペランドの順番で記述する単純な構成のためです。ただし、それを何万行と書かなければいけないことが最大の難点といえるでしょう。


蛇足ですが、私が以前に職業訓練を受けたときのことでした。


担当した先生が大手企業「ルネサスエレクトロニクス」出身の方で、組込み業務の大変さを語ってくださいました。


その中で、アセンブリをマイコンに100万行超えで記述しないといけないということを聴き、ぶったまげたのを覚えています。


100万行...まあCASL2ではそこまでの記述をしないのが救いですね~。- -;



オペコード



オペコードとは演算子(オペレーションコード: Operation Code)のことで、どういう処理をさせたいかその動作の種類を記述します。


英語で言う「動詞」の部分に相当します。また、四則演算でいえば、「+」や「×」の記号に相当する部分です。


例えば、英語で、「Add A and B」だと、「AとBを加算しろ」という意味になりますが、アセンブリ言語においても英語の命令文と感覚は一緒です。


【オペコードの例】
  • LD GR1, GR2 ←このLDの部分です。





オペランド



オペランドとは、被演算子(オペランド: Operand)のことで、計算対象になるデータのことです。


「オペレーションランド」を短縮した言葉ではなく、「オペランド」という一つの単語です。


オペコードがオペレーションコードの短縮した呼び方であるため、オペランドにも適用されると思われることがありますが間違いです。


CASL2では、第1~第3までオペランドを指定できます。


また、英語でいう「目的語」の部分に相当し、四則演算の、「A + B」や「A × B」のAやBに相当する部分です。


ちなみに、日本語の「被~」の「被」というのは「~される」という意味を持つ接頭語です。


したがって、被演算子ということは、「計算されるもの」ということが分かります。


【オペランドの例】
  • LD GR1, GR2 ←この「GR1, GR2」の部分です。



ニーモニック



ニーモニックとは、機械語を人間に分かりくアルファベットに置き換えたもののことです。


アセンブリ言語そのものを指すという認識で問題ありません。



ラベル



プログラムの行の先頭に好きな名前をつけることができます。


名前をつけると、COMET2が内部でアドレスと名づけたラベルを紐づける作業を行ってくれます。


※ ラベルの長さは8文字までで、「GR0~GR7」の汎用レジスタ名は予約語のためラベルとしては使用できません。



コメント文



文法とは関係なしに、プログラムコード上に好きにメモ(文章)を記述できます。


CASL2では「; (セミコロン)」の後に記述します。


本当は、コメントに際して、細かい規定があるようですが、セミコロンさえ記述しておけば間違いないため特に気にする必要はないでしょう。


ただし、オペコードとオペランドの間やラベルとオペコードの間に書くのはNGです!


記述した文章は、機械語に変換される際に無視されるためプログラム自体に影響を及ぼすことはありません。


プログラムを書いて、後で見て分かり難いと感じる行に、その行でやりたいことをメモしておいてもいいでしょう。





文字コード表の見方



コンピュータは、文字コード表を参照してから、ディスプレイに文字を表示する方法をとっています。


以下の文字コード表は、「JIS-X-0201」と呼ばれるもので、CASL2で入出力される文字は、このコード表に基づいています。


例えば、下記表から「A」という文字を文字コードとして表したいなら「41」ということになります。


文字コード表の読み方は、「列番号 行番号」の順番で知りたい文字の文字コードを表しています。


【文字コード表】



また、文字「B」であれば文字コードは「42」、文字「K」であれば文字コードは「4B」ということになります。


ここで、文字「K」の文字コード「4B」の「B」は「11」という数字を表しています。


アルファベットの「B」は、16進数で「11」を表す数字のため、このような記述になります。


ちなみに16進数は、「A、B、C、D、E、F」の順番で「10、11、12、13、14、15」の数字が対応しています。







おすすめのシミュレータ



シミュレータは以下のサイト様に載せられているフリーソフトを使用しました。


このソフトは個人的に使い勝手がいいのでおすすめです。

↓↓↓

キャッスルシミュレータ


ちなみに、すぐに動作を確認したい場合はWEB上で動作する「キャッスルシミュレータ - Web版シミュレータ」もおすすめです。

↓↓↓

キャッスルシミュレータ - Web版シミュレータ


何れも、全く同じ動作をしています。各シミュレータにおいてレジスタの仕様に差異は特に見当たりませんでした。





最後に



今回は、CASL2を扱う上で必要な内容を説明いたしました。


そもそもコンピュータに慣れていない内は、難しく感じるかもしれません。


まずは、「まだ詳しくは知らないけど、CPUにはレジスタがあるのね」くらいから覚えていけば大丈夫でしょう。


詳細はまた次回にご期待を!














プロフィール

ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ