メディア

第4回 プログラム言語とは何か宮崎 仁のマイコン基礎の基礎

» 2013年01月25日 00時00分 公開
[PR/EDN Japan]
PR

 コンピュータのプログラムを書くために、各種の文法規則が作られています。大別すると、マイコンが理解できる機械語、機械語と直接対応するアセンブリ言語、人間に分かりやすいように機械語とは関係なく作られた高級言語の三つになります。高級言語にはC、C++、Javaなどさまざまな種類があります。

 今回は、これらのプログラム言語(Programming Language)を見ていきましょう。

マイコンが理解できるのは機械語だけ

 図1のように、マイコンはCPU(中央処理装置)、メモリ(主記憶装置)、I/O(入出力装置)の三要素で構成されます。実行したい機械語のプログラムをメモリに格納して、マイコンを起動すれば、CPUが自動的にメモリから一つずつ命令を取り出して実行します。

 CPUがメモリから命令を取り出すことを、フェッチ(fetch)と呼びます。

 メモリに記憶されているのは、8ビット(1バイト)単位の2進データです。16ビット(2バイト)や32ビット(4バイト)で1個の命令となっている場合もあります。CPUはフェッチした2進命令を専用のデコーダ回路でデコード(decode)して、必要な処理を行います。これが命令の実行(execute)です。

図1 メモリから機械語命令を取り出して実行する
コンピュータはCPU、メモリ、I/Oの3要素から構成される。メモリには、機械語命令が実行順に格納されている。CPUはメモリから命令をフェッチし、デコードし、実行する。(I/Oは、命令実行のしくみには直接関係しない)

 アセンブリ言語や高級言語のプログラムは、人間が理解しやすいように文字(たいていは英数字と記号)で書かれていて、CPUは直接デコードできません。そこで、通常はあらかじめ別のソフトウェアを使ってアセンブリ言語や高級言語のプログラムを機械語に翻訳し、生成された機械語プログラムをメモリに格納して実行します。この翻訳ソフトウェアをアセンブラ(assembler)、コンパイラ(compiler)と呼びます(図2)。

 また、一部の高級言語では、あらかじめコンパイラで翻訳するかわりに、高級言語の命令をリアルタイムで翻訳しながら実行することが可能です。このようなリアルタイムの翻訳ソフトウェアには、インタープリタやJIT(Just-In-Time)コンパイラがあります。この場合も、CPUは高級言語の命令を直接実行しているわけではなくて、CPU上で実行されているインタープリタやJITコンパイラが翻訳した機械語を、一つずつ実行していることになります。

アセンブリ言語プログラムは、アセンブラで機械語に翻訳される。機械語プログラムは、マイコンのメモリに格納して実行できる。
図2 アセンブリ言語、高級言語を機械語に翻訳する
高級言語プログラムは、コンパイラで翻訳される。コンパイラには、直接機械語を出力するものや、アセンブリ言語や中間言語を出力するものがある。後者の場合も、最終的に機械語プログラムに変換されてから実行される。

機械語に直接対応するアセンブリ言語

 人間に理解しやすい言語として最初に作られたのは、アセンブリ言語です。これは、機械語命令の一つ一つを英語の記号(ニーモニック)に置き換えたものです。英語の記号としては、通常はその命令の機能を示す英単語を2〜4文字程度に短縮したものが用いられます。単なる0と1の羅列である機械語命令より、はるかに読みやすく、書きやすいものとなっています。

 ただし、機械語命令はきわめて単純な操作を行うものがほとんどであり、アセンブリ言語のプログラムは一般に長く、複雑な構造になってしまいます。また、機械語はマイコンの機種(ファミリ)によって異なるので、アセンブリ言語もマイコンごとに異なったものとなります。

 ニーモニックは機械語命令と1対1に対応しているので、機械語への変換は容易です。したがって、アセンブラ(翻訳ソフトウェア)も容易に作れます。また、開発者が記述した通りの機械語プログラムが得られるので、プログラムのメモリ容量をできるだけ小さくしたいときや、実行のステップ数や実行時間を厳密に決めたいときにはアセンブリ言語が役立ちます。

 図3に、TIの超低消費電力マイコンであるMSP430™ファミリのニーモニックの一部を示します。MSP430は基本命令が27個ときわめてシンプルに作られています。

 代表的な機械語命令の例として、CPU内部の記憶場所であるレジスタからレジスタにデータを転送したり、メモリとレジスタの間でデータを転送するMOV命令があります。MOV命令では、通常はソース(転送元)とデスティネーション(転送先)の二つのオペランド(被演算子)を指定する必要があります。

 また、レジスタにあるデータに何らかの演算を行って、演算結果をレジスタに戻すような演算命令がたくさんあります。RRC命令は、レジスタにある2進データの各ビットを右回転(1ビットずつ右にずらす)します。なお、この命令ではオペランドはデスティネーションしか指定しません。多くのマイコンは命令をコンパクトにするために、デスティネーションに指定したデータに演算を行い、またデスティネーションに書き戻す方式を採用しています。

 ADD命令は二つの数値の加算、SUB命令は減算を行います。2個のソースが必要ですが、同様にデスティネーションがソースの一方を兼ねています。

 オペランドをもたない命令には各種のジャンプ命令があります。ジャンプ命令は、オペランドのかわりにジャンプ先アドレスをラベルで指定します。

図3 MSP430のニーモニックの例
ニーモニック 動作 説明
オペランドが2個ある命令の例
MOV src,dst src ⇒ dst srcのデータをdstに書き込む
ADD src,dst src + dst ⇒ dst srcとdstを加算して結果をdstに書き込む
ADDC src,dst src + dst + C ⇒ dst srcとdstとキャリを加算して結果をdstに書き込む
SUB src,dst dst - src ⇒ dst dstからsrcを減算して結果をdstに書き込む
AND src,dst src AND dst ⇒ dst srcとdstの論理積をdstに書き込む
XOR src,dst src XOR dst ⇒ dst srcとdstの排他的論理和をdstに書き込む
オペランドが1個ある命令の例
RRC dst LSB ⇒ C、C ⇒ MSB
bit(n) ⇒ bit(n-1)
dstの各ビットを1ビットずつ右にずらす。LSBはキャリに、キャリはMSBに移す。
SWPB dst bit(15:8) ⇔ bit(7:0) dstの上位バイトと下位バイトを入れ替える。
ジャンプ命令の例
JMP label label ⇒ PC 常にlabelアドレスにジャンプ
JZ label Zならlabel ⇒ PC ゼロであればlabelアドレスにジャンプ
JNZ label NZならlabel ⇒ PC ゼロでなければlabelアドレスにジャンプ
(注)
src:ソース(転送元)オペランド
dst:デスティネーション(転送先)オペランド
キャリ(C):直前の演算結果で桁上がりが発生したことを示す情報
label:ジャンプ先アドレスの指定
ゼロ(Z):直前の演算結果が0であることを示す情報

翻訳しないと使えない高級言語

 最も人間に理解しやすい言語として、さまざまな高級言語が作られています。アセンブリ言語はマイコンの機種によって異なりますが、高級言語はマイコンの機種に依存しません。例えば、C言語で書いたプログラムは、TIのMSP430ファミリでも、Stellaris®ファミリでも、C2000™ファミリでも、それぞれのCコンパイラで翻訳して実行できます。他のメーカーのマイコンでも、Cコンパイラさえあれば、翻訳して実行できます。

 また、高級言語でプログラムを書くときは、マイコンのレジスタ、メモリアドレス、I/Oポートなどの細かい機能を意識する必要はありません。これは、高級言語の利点ですが、同時に欠点でもあります。そういう機種に依存する部分は、高級言語では記述することができないのです。

 C言語のようにマイコン向けで広く使われている高級言語は、アセンブリ言語を用いた記述と高級言語を用いた記述を容易に混在させることができます。それによって、マイコンのもつ機能をすべて利用することができます。

 また、C言語の場合は高級言語の中でも比較的低レベルの機能をもっていて、例えばポインタを活用すればある程度のメモリ操作を行うことができます。if文、while文、for文などの構文も、アセンブリ言語のジャンプ命令に似たシンプルな構成になっています。

さらに、C言語では追加機能を関数として定義し、ライブラリ化することによって別の開発でも容易に再利用することができます。これらのことは、マイコン向けの高級言語としてC言語が広く普及している理由でもあります。

 最近では、多くのマイコンでCコンパイラが利用できるようになり、また機種依存のさまざまな機能を利用するためのライブラリがマイコンのメーカーから供給されています。

 例えば、TIの場合はMSP430Ware、StellarisWareなど、ファミリごとに豊富なドライバやサンプルコードのライブラリが供給されているので、C言語を用いてマイコンの機能、性能をフルに活用することができます。

※MSP430、C2000、Herculesは Texas Instrumentsの商標です。StellarisはTexas Instrumentsの登録商標です。その他すべての商標および登録商標はそれぞれの所有者に帰属します。

TIのマイコン製品の詳細はこちら

宮崎 仁のマイコン基礎の基礎 第5回 「メモリのしくみと種類」は、2/25(月)の公開を予定しています。


Copyright © ITmedia, Inc. All Rights Reserved.


提供:日本テキサス・インスツルメンツ株式会社
アイティメディア営業企画/制作:EDN Japan 編集部/掲載内容有効期限:2013年3月31日

設計に役立つヒント集

宮崎 仁のQ&Aでよく分かるマイコン基礎の基礎:
第24回 割り込みっていろいろあるのですか?どんな種類があるか教えてください。

今回は、外部割り込み、内部割り込み、ソフトウェア割り込みについて詳しく解説しています
全文を読む


電源IC選択のヒント集
電源IC 使用時の注意点をわかりやすく説明しているほか、使用時に発生する可能性のあるさまざまなトラブルとその対処法についても紹介しています。ぜひご利用ください。ダウンロードには myTI アカウントが必要です。
Part 1をダウンロード
Part 2をダウンロード


アナログ回路設計式一覧ポケット・ガイド
日本語版 PDF

英語版で高い評価を受けてきたポケット・ガイドの日本語版が完成しました。基板レベルやシステム・レベルの回路設計でよく使われるアナログ設計式を紹介しています。ダウンロードには myTI アカウントが必要です。
ダウンロード



facebook & twitter

製品情報、セミナーや展示会などのイベント情報をお知らせしています。

RSSフィード

公式SNS

EDN 海外ネットワーク

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.