今回はARMアーキテクチャとアセンブリ言語についてまとめていく。
アセンブリ言語とは
アセンブリ言語とは、コンピュータのプロセッサが直接解釈可能な機械語に極めて近接したプログラミング言語である。機械語命令を人間が理解しやすい形式で表現する特性を持つ。
アセンブリ言語は、特定のプロセッサアーキテクチャに密接に関連しており、その命令セットに直接対応している。
アセンブリ言語の主な特徴は以下の通りである:
- 低レベル言語:アセンブリ言語は、機械語に非常に近い低レベル言語であり、プログラマがコンピュータのハードウェアをより直接的に制御できる。
- ハードウェア依存性:各アセンブリ言語は特定のプロセッサアーキテクチャ(例えば、ARM、x86、MIPSなど)固有のものである。
- 命令とオペランド:アセンブリ言語の命令は、プロセッサが実行する操作(加算、減算、データ転送など)を表し、オペランドはそれらの操作に必要なデータやデータの位置(アドレス)を指す。
- 効率と制御の向上:アセンブリ言語を使用することで、メモリやプロセッサのリソースを細かく管理し、最適化することが可能である。これは、リアルタイムシステムや埋め込みシステムなど、パフォーマンスが重要なアプリケーションで特に有用である。
- アセンブラによる変換:アセンブリ言語で記述されたプログラムは、アセンブラという特殊なプログラムを用いて機械語に変換される。
アセンブリ言語は、高レベル言語に比べて複雑で扱いにくい側面があるが、システムの低レベルの動作を深く理解するためには非常に有効である。
ARMで使用されるレジスタ
CPU内では、レジスタが一時的な情報保存に使用される。この情報には、処理されるデータ片や、取得されるデータを指すアドレスが含まれることがある。
Armには、算術演算や論理演算のために16個のレジスタが備わっている。これらのレジスタは全て32ビット幅である。
レジスタの32ビットは、最上位ビット(MSB)のD31から最下位ビット(LSB)のD0までを含む。32ビットのデータ型を用いる場合、32ビット以上のデータは処理前に32ビットのチャンクに分割される必要がある。
Armではデフォルトのデータサイズが32ビットであり、シングルビット、8ビット、16ビットのデータ型も一部の命令でサポートされている。
32ビットのデータサイズは「ワード」と呼ばれ、16ビットのデータは「ハーフワード」とされる。よって、Armはバイト、ハーフワード(2バイト)、ワード(4バイト)のデータ型をサポートしている。
データ型 | ビット数 | 可能なビット範囲 | 説明 |
---|---|---|---|
ワード | 32ビット | D31 – D0 | 32ビットのデータ型 |
ハーフワード | 16ビット | D15 – D0、D31 – D16 | 16ビットのデータ型 |
バイト | 8ビット | D7 – D0、D15 – D8、… | 8ビットのデータ型 |
ARMアーキテクチャにおけるレジスタの役割をマトリックス形式でまとめると以下のようになる。
ARMアーキテクチャでは、一般的に次のようなレジスタが利用される。
レジスタ | 役割/用途 | 特徴/備考 |
---|---|---|
R0 – R7 | 一般目的レジスタ(General Purpose) | 関数の引数と戻り値に使われることが多い。操作が高速。 |
R8 – R12 | 一般目的レジスタ | 追加の作業レジスタ。 |
R13 (SP) | スタックポインタ(Stack Pointer) | 現在のスタックのトップを指す。 |
R14 (LR) | リンクレジスタ(Link Register) | サブルーチン/関数からの戻りアドレスを保持。 |
R15 (PC) | プログラムカウンタ(Program Counter) | 現在実行中の命令のアドレスを保持。 |
CPSR | カレントプログラムステータスレジスタ | 条件フラグと現在の実行モードを保持。 |
SPSR | セーブドプログラムステータスレジスタ | 例外発生時のCPSRの値を保存。 |
各レジスタは特定の用途に用いられ、アセンブリ言語プログラムや機械語命令の実行において重要な役割を果たしている。
一般目的レジスタ(R0からR12)は、データの保持や操作、関数の引数の渡し等に使用される。
スタックポインタ(SP)、リンクレジスタ(LR)、プログラムカウンタ(PC)は、関数の呼び出し、実行フローの制御、プログラムの状態の管理などに不可欠である。
CPSRとSPSRは、プログラムの状態や例外処理の際のプログラムの挙動を制御する。
MOV命令
ARMアセンブリ言語において最も基本的なMOVE命令をまとめていく
まず初めに、アセンブリ言語における「命令」は、コンピュータに特定の操作を行うよう指示する基本的なコマンドや文である。
アセンブリ言語は、機械語(コンピュータのプロセッサが直接解釈できる言語)に非常に近い形で記述されるが、人間が理解しやすい形式で表現されている。
命令の基本構成要素
- 命令(Instruction): コンピュータに何をすべきかを指示するコマンド。例えば「データを加算する」、「メモリからデータを読み込む」など。
- オペランド(Operand): 命令が作用する対象。データ、レジスタ、メモリアドレスなどがこれに該当します。
アセンブリ言語におけるMOV
命令は、特定のオペランドから別のオペランドへデータを転送するために使用される命令である。
この命令は、コンピュータにデータを移動する操作を指示する。MOV
命令の理解には、命令とオペランドの概念が重要である。
以下の表は、MOV
命令の構造とその要素を示している:
構成要素 | 説明 | 例 |
---|---|---|
命令 | 実行する操作を指定する。MOV はデータ移動を意味する。 | MOV |
オペランド | 命令が作用するデータや場所を指定する。 | R1, #10 (R1レジスタに10を設定) |
この例では、MOV R1, #10
という命令がある。
この命令は、「10」という値(即値オペランド)をR1レジスタ(目的オペランド)に移動することを指示する。
このように、MOV
命令は、データをレジスタ間で移動したり、即値をレジスタに設定するために使用される。
アセンブリ言語における命令は、そのような基本的な操作を指示するための手段であり、プログラマはこれらを組み合わせてより複雑な動作を実現する。
MOV命令の具体例
アセンブリ言語におけるMOV
命令は、データを一箇所から別の箇所に転送する基本的な命令である。
この命令は、特にデータの移動や値の設定において重要な役割を果たす。以下の表に、MOV
命令の使用方法、その説明、および具体的な例を示す。
使用方法 | 説明 | 具体的な例 | データの動き |
---|---|---|---|
即値をレジスタに設定 | 即値を指定してレジスタに値を設定する。 | MOV R0, #5 | 値5がR0レジスタに設定される |
レジスタ間データ転送 | あるレジスタの値を別のレジスタにコピーする。 | MOV R1, R2 | R2レジスタの内容がR1レジスタにコピーされる |
即値をレジスタに設定(16進数) | 16進数の即値をレジスタに設定する。 | MOV R0, #0x87 | 16進数の0x87(135 in 10進数)がR0レジスタに設定される |
例えば、MOV R0, #5
はレジスタR0に5という値を設定することを意味する。この場合の#5
は10進数で表されている。
一方で、#0x87
のような記述は16進数の値を示し、この場合は135(10進数)と等しい。MOV
命令はこれらの形式の即値をサポートし、値を直接レジスタにロードするのに使用される。
また、レジスタ間でデータを転送する際にもMOV
命令は使われる。例えば、MOV R1, R2
はレジスタR2の内容をレジスタR1にコピーする。