Assembly-programming-assembly-introduction
組み立て-はじめに
アセンブリ言語とは何ですか?
各パーソナルコンピューターには、コンピューターの算術、論理、および制御アクティビティを管理するマイクロプロセッサーがあります。
プロセッサの各ファミリには、キーボードからの入力の取得、画面上の情報の表示、その他のさまざまなジョブの実行など、さまざまな操作を処理するための独自の命令セットがあります。 これらの命令セットは「マシン言語命令」と呼ばれます。
プロセッサは、1と0の文字列である機械語命令のみを理解します。 しかし、機械語はソフトウェア開発で使用するにはあまりにも曖昧で複雑です。 そのため、低レベルアセンブリ言語は、シンボリックコードおよびより理解しやすい形式でさまざまな命令を表す特定のプロセッサファミリ向けに設計されています。
アセンブリ言語の利点
アセンブリ言語を理解すると、次のことに気付くことができます-
- プログラムがOS、プロセッサ、およびBIOSとどのようにインターフェイスするか。
- メモリおよびその他の外部デバイスでデータがどのように表されるか。
- プロセッサが命令にアクセスして実行する方法。
- 命令がデータにアクセスして処理する方法。
- プログラムが外部デバイスにアクセスする方法。
アセンブリ言語を使用する他の利点は次のとおりです-
- メモリと実行時間が少なくて済みます。
- ハードウェア固有の複雑なジョブをより簡単な方法で許可します。
- タイムクリティカルなジョブに適しています。
- 割り込みサービスルーチンやその他のメモリ常駐プログラムの作成に最適です。
PCハードウェアの基本機能
PCの主要な内部ハードウェアは、プロセッサ、メモリ、およびレジスタで構成されています。 レジスタは、データとアドレスを保持するプロセッサコンポーネントです。 プログラムを実行するために、システムはそのプログラムを外部デバイスから内部メモリにコピーします。 プロセッサはプログラム命令を実行します。
コンピュータストレージの基本単位は少しです。 ON(1)またはOFF(0)になります。 関連する9ビットのグループで1バイトが作成され、そのうち8ビットがデータに使用され、最後の1ビットがパリティに使用されます。 パリティの規則に従って、各バイトでON(1)になっているビットの数は常に奇数である必要があります。
したがって、パリティビットは、バイトのビット数を奇数にするために使用されます。 パリティが偶数の場合、システムは、パリティエラー(まれではありますが)があったと想定します。パリティエラーは、ハードウェア障害または電気障害が原因で発生した可能性があります。
プロセッサは、次のデータサイズをサポートしています-
- Word:2バイトのデータ項目
- ダブルワード:4バイト(32ビット)データ項目
- クワッドワード:8バイト(64ビット)データ項目
- 段落:16バイト(128ビット)領域
- キロバイト:1024バイト
- メガバイト:1,048,576バイト
2進数システム
すべての番号システムは位置表記法を使用します。つまり、数字が書き込まれる各位置には異なる位置値があります。 各位置はベースの累乗であり、2進数システムでは2です。これらの累乗は0から始まり、1ずつ増加します。
次の表は、すべてのビットがオンに設定されている8ビットの2進数の位置値を示しています。
Bit value | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Position value as a power of base 2 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
2進数の値は、1ビットの存在とその位置値に基づいています。 だから、与えられた2進数の値は-
1 + 2 + 4 + 8 +16 + 32 + 64 + 128 = 255
これは2 ^ 8 ^-1と同じです。
16進数システム
16進数システムでは、基数16が使用されます。 このシステムの数字の範囲は0〜15です。 慣例により、A〜Fの文字は、10〜15の10進値に対応する16進数字を表すために使用されます。
計算の16進数は、長いバイナリ表現を短縮するために使用されます。 基本的に、16進数システムは、各バイトを半分に分割し、各ハーフバイトの値を表現することにより、バイナリデータを表します。 次の表は、10進数、2進数、および16進数の同等物を提供します-
Decimal number | Binary representation | Hexadecimal representation |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
2進数を16進数に変換するには、右から順に4つの連続したグループのグループに分割し、16進数の対応する数字の上にそれらのグループを書き込みます。
例-2進数1000 1100 1101 0001は16進数と同等-8CD1
16進数を2進数に変換するには、各16進数を4桁の2進数に書き込みます。
例-16進数FAD8は2進数と同等-1111 1010 1101 1000
バイナリ演算
次の表は、バイナリ加算の4つの単純なルールを示しています-
(i) | (ii) | (iii) | (iv) |
---|---|---|---|
1 | |||
0 | 1 | 1 | 1 |
+0 | +0 | +1 | +1 |
=0 | =1 | =10 | =11 |
ルール(iii)および(iv)は、次の左位置への1ビットのキャリーを示しています。
例
Decimal | Binary |
---|---|
60 | 00111100 |
+42 | 00101010 |
102 | 01100110 |
負のバイナリ値は、* 2の補数表記*で表されます。 この規則によれば、2進数を負の値に変換するには、ビット値を反転して1を加算します。
例
Number 53 | 00110101 |
Reverse the bits | 11001010 |
Add 1 | 00000001 |
Number -53 | 11001011 |
1つの値を別の値から減算するには、減算する数値を2の補数形式に変換し、数値を加算します。
例
53から42を引きます
Number 53 | 00110101 |
Number 42 | 00101010 |
Reverse the bits of 42 | 11010101 |
Add 1 | 00000001 |
Number -42 | 11010110 |
53 - 42 = 11 | 00001011 |
最後の1ビットのオーバーフローは失われます。
メモリ内のデータのアドレス指定
プロセッサが命令の実行を制御するプロセスは、*フェッチ-デコード-実行サイクル*または*実行サイクル*と呼ばれます。 それは3つの連続したステップで構成されています-
- メモリから命令を取得する
- 命令のデコードまたは識別
- 命令を実行する
プロセッサは、一度に1バイト以上のメモリにアクセスできます。 16進数の0725Hを考えてみましょう。 この数には2バイトのメモリが必要です。 上位バイトまたは最上位バイトは07で、下位バイトは25です。
プロセッサはデータを逆バイトシーケンスで保存します。つまり、下位バイトは下位メモリアドレスに、上位バイトは上位メモリアドレスに格納されます。 したがって、プロセッサがレジスタからメモリに値0725Hを持ってくると、最初に25を下位メモリアドレスに転送し、07を次のメモリアドレスに転送します。
x:メモリアドレス
プロセッサがメモリから数値データを取得して登録すると、再びバイトを反転します。 2種類のメモリアドレスがあります-
- 絶対アドレス-特定の場所の直接参照。
- セグメントアドレス(またはオフセット)-オフセット値を持つメモリセグメントの開始アドレス。