Embedded-systems-es-assembly-language
組み込みシステム-アセンブリ言語
アセンブリ言語は、マシンレベルのコード命令に*ニーモニック*またはシンボルを提供するために開発されました。 アセンブリ言語プログラムはニーモニックで構成されているため、マシンコードに変換する必要があります。 この変換を担当するプログラムは*アセンブラー*と呼ばれます。 アセンブリ言語は、CPUの内部構造と直接連動するため、しばしば低レベル言語と呼ばれます。 アセンブリ言語でプログラムするには、プログラマはCPUのすべてのレジスタを知っている必要があります。
C、C ++、Javaなどのさまざまなプログラミング言語は、CPUの内部詳細を処理しないため、高レベル言語と呼ばれます。 対照的に、アセンブラは、アセンブリ言語プログラムをマシンコード(*オブジェクトコード*または*オペコード*とも呼ばれる)に変換するために使用されます。 同様に、コンパイラーは高水準言語をマシンコードに翻訳します。 たとえば、C言語でプログラムを作成するには、Cコンパイラを使用してプログラムを機械語に翻訳する必要があります。
アセンブリ言語の構造
アセンブリ言語プログラムは一連のステートメントであり、ADDやMOVなどのアセンブリ言語命令、または directives と呼ばれるステートメントのいずれかです。
命令*はCPUに何をすべきかを指示し、一方*指令(*疑似命令*とも呼ばれます)はアセンブラに命令を与えます。 たとえば、ADDおよびMOV命令はCPUが実行するコマンドであり、ORGおよびENDはアセンブラディレクティブです。 アセンブラは、ORGディレクティブが使用されると、メモリ位置0にオペコードを配置し、ENDはソースコードの終わりを示します。 プログラム言語の命令は、次の4つのフィールドで構成されています-
[ label: ] mnemonics [ operands ] [;comment ]
角括弧([])は、フィールドがオプションであることを示します。
- * labelフィールド*を使用すると、プログラムは名前でコードの行を参照できます。 ラベルフィールドは、特定の文字数を超えることはできません。
- *ニーモニック*および*オペランドフィールド*は、一緒にプログラムの実際の作業を実行し、タスクを達成します。 ADD A、C、MOV C、#68のようなステートメント。ADDとMOVはニーモニックで、オペコードを生成します。 「A、C」および「C、#68」はオペランドです。 これらの2つのフィールドには、ディレクティブを含めることができます。 ディレクティブはマシンコードを生成せず、アセンブラによってのみ使用されますが、命令はCPUが実行するマシンコードに変換されます。
1.0000 ORG 0H ;start (origin) at location 0
2 0000 7D25 MOV R5,#25H ;load 25H into R5
3.0002 7F34 MOV R7,#34H ;load 34H into R7
4.0004 7400 MOV A,#0 ;load 0 into A
5.0006 2D ADD A,R5 ;add contents of R5 to A
6.0007 2F ADD A,R7 ;add contents of R7 to A
7.0008 2412 ADD A,#12H ;add to A value 12 H
8.000A 80FE HERE: SJMP HERE ;stay in this loop
9.000C END ;end of asm source file
- *コメントフィールド*は、コメントインジケータであるセミコロンで始まります。
- プログラムのラベル「HERE」に注意してください。 命令を参照するラベルには、コロンが続く必要があります。
8051プログラムの組み立てと実行
ここでは、アセンブリ言語の基本形式について説明します。 アセンブリ言語プログラムを作成、アセンブル、および実行する手順は次のとおりです-
- まず、エディターを使用して、上記のプログラムに類似したプログラムを入力します。 すべてのMicrosoftオペレーティングシステムに付属するMS-DOS EDITプログラムなどのエディターを使用して、プログラムを作成または編集できます。 エディターはASCIIファイルを作成できる必要があります。 ソースファイルの「asm」拡張子は、次のステップでアセンブラーによって使用されます。
- 「asm」ソースファイルには、手順1で作成したプログラムコードが含まれています。 8051アセンブラーに供給されます。 次に、アセンブラはアセンブリ言語命令をマシンコード命令に変換し、。objファイル(オブジェクトファイル)および* .lstファイル*(リストファイル)を生成します。 *ソースファイル*とも呼ばれるため、一部のアセンブラはこのファイルに「src」拡張子を付ける必要があります。 「lst」ファイルはオプションです。 すべてのオペコードとアドレス、およびアセンブラーが検出したエラーをリストするため、プログラムにとって非常に便利です。
- アセンブラーには、 link と呼ばれる3番目のステップが必要です。 リンクプログラムは、1つ以上のオブジェクトファイルを取得し、拡張子が「abs」の絶対オブジェクトファイルを生成します。
- 次に、「abs」ファイルは「OH」(オブジェクトから16進数へのコンバーター)と呼ばれるプログラムに送られ、ROMに書き込む準備ができている拡張子「hex」を持つファイルが作成されます。
データ・タイプ
8051マイクロコントローラーには、8ビットの単一データ型が含まれており、各レジスタも8ビットサイズです。 プログラマーは、CPUで処理できるように、8ビット(00からFFH、または10進数で255)より大きいデータを分解する必要があります。
DB(バイトの定義)
DBディレクティブは、アセンブラで最も広く使用されているデータディレクティブです。 8ビットのデータを定義するために使用されます。 また、10進数、2進数、16進数、またはASCII形式のデータを定義するためにも使用できます。 10進数の場合、10進数の後の「D」はオプションですが、「B」(2進数)および「Hl」(16進数)には必須です。
ASCIIを示すには、単に文字を引用符で囲みます(「このように」)。 アセンブラは、数字/文字のASCIIコードを自動的に生成します。 DBディレクティブは、2文字を超えるASCII文字列を定義するために使用できる唯一のディレクティブです。したがって、すべてのASCIIデータ定義に使用する必要があります。 DBのいくつかの例を以下に示します-
ORG 500H
DATA1: DB 28 ;DECIMAL (1C in hex)
DATA2: DB 00110101B ;BINARY (35 in hex)
DATA3: DB 39H ;HEX
ORG 510H
DATA4: DB "2591" ;ASCII NUMBERS
ORG 520H
DATA6: DA "MY NAME IS Michael" ;ASCII CHARACTERS
ASCII文字列の前後に単一引用符または二重引用符を使用できます。 DBは、バイトサイズのチャンクでメモリを割り当てるためにも使用されます。
アセンブラーディレクティブ
8051の指令のいくつかは次のとおりです-
- * ORG(origin)*-originディレクティブは、アドレスの始まりを示すために使用されます。 数値は16進形式または10進形式で取ります。 数値の後にHが指定されている場合、その数値は16進数として扱われ、そうでない場合は10進数として扱われます。 アセンブラは10進数を16進数に変換します。
- * EQU(等しい)*-メモリ位置を占有せずに定数を定義するために使用されます。 EQUは、ラベルがプログラムに表示されるように定数値をデータラベルに関連付け、その定数値がラベルに置き換えられます。 命令「MOV R3、#COUNT」の実行中、レジスタR3に値25がロードされます(#記号に注意)。 EQUを使用する利点は、プログラマーが1回変更するだけで、アセンブラーがすべてのオカレンスを変更できることです。プログラマはプログラム全体を検索する必要はありません。
- * ENDディレクティブ*-ソース(asm)ファイルの終わりを示します。 ENDディレクティブはプログラムの最後の行です。 ENDディレクティブの後のものは、アセンブラによって無視されます。
アセンブリ言語のラベル
アセンブリ言語のすべてのラベルは、次のルールに従う必要があります-
- 各ラベル名は一意である必要があります。 アセンブリ言語プログラミングでラベルに使用される名前は、大文字と小文字の両方のアルファベット文字、0〜9の数字、および疑問符(?)、ピリオド(。)、レート@、アンダースコア(_)などの特殊文字で構成されます。およびドル($)。
- 最初の文字はアルファベットにする必要があります。数字にすることはできません。
- 予約語は、プログラムでラベルとして使用できません。 たとえば、ADDワードとMOVワードは命令ニーモニックであるため、予約語です。