アセンブリ言語と機械語 (同じ基本システムの場合) は本当に同じですか? これら2つの概念に違いはありますか?
9 に答える
アセンブリ言語は、機械語よりも便利なメカニズムです。アセンブリ言語では、数値オペレーション コードの代わりにニーモニック シーケンスを使用し、手動でオフセットを計算する代わりに記号ラベルを使用できます。また、不正なプロセッサ命令を入力するなど、本当にばかげたエラーからも保護します。
それ以外の場合、アセンブリ言語は機械語と同等です。場合によっては、新しいプロセッサの一部の命令のニーモニックをサポートしない古いアセンブラを使用することがあります。その場合でも、命令コードをプログラムに直接挿入できます。
機械語は、CPU のオペコードの「ビット エンコーディング」です。
アセンブリ言語は、CPU のオペコードの「シンボリック エンコーディング」です。
たとえば、象徴的に:
loop: dec R1 # Decrement register R1
bnq loop # Branch if not equal to zero to
# address "loop"
ビットエンコーディングになります:
# Mythical CPU Machine code 4 bits operation,
# 4 bit "option"
0x41 # 4 is a "dec" and represents r1;
0x7E # 7 is bnq and E means PC -2;
通常、これは 1 対 1 の関係ですが、一部のアセンブリ言語には、複数のマシン コード命令にマップするか、別のオペコードを再利用する追加のアセンブリ命令が時折あります。マシンコード「xor R1、R1」を「clr R1」または非常に類似したものとして使用するなど。
さらに、アセンブリ言語は「マクロ プログラミング」をサポートする傾向があり、アセンブリが広く使用されていた 80 年代には、ソース コードがより「高レベル」な外観になりました。一般的な操作を簡略化するために、"plot x,y" や "Hex Val" のようなアセンブリ マクロを個人的に作成しました。
例えば:
# Mythically CPU Macro
.macro spinSleep x,y
ld #x,y
localLoop: dec y
brq localLoop
.endmacro
# Macro invocation
spinSleep 100,R1
# Macro expantion
ld #100,R1
localLoopM: dec R1
brq localLoopM # localLoopM is "Mangled" for localization.
本当に良い説明を見つけたので、他の人が読めるようにここに投稿しようと思いました:
機械語は、コンピューター内のプロセッサを制御するために使用される実際のビットであり、通常は一連の 16 進数 (通常はバイト) として表示されます。プロセッサはこれらのビットをプログラム メモリから読み取ります。これらのビットは、次に何をすべきかについての「命令」を表します。このように、機械語は、コンピュータに命令を入力する方法を提供します (スイッチ、パンチ テープ、またはバイナリ ファイルを介して)。
アセンブリ言語は、人間が読みやすい機械語のビューです。機械語を数字で表す代わりに、命令とレジスタには名前が付けられます (通常は略語またはニーモニックです。たとえば、ld は「ロード」を意味します)。高級言語とは異なり、アセンブラは機械語に非常に近い言語です。主な抽象化 (ニーモニックを除く) は、固定メモリ アドレスとコメントの代わりにラベルを使用することです。
アセンブリ言語プログラム (テキスト ファイル) は、アセンブラによって機械語に変換されます。逆アセンブラは逆の機能を実行します (ただし、コメントとラベルの名前はアセンブラ プロセスで破棄されます)。
アセンブリでは、命令は CPU 命令のわかりやすい表現です。
しかし、アセンブラは、例えばアドレス指定をより簡単にします:
- 機械語では、現在の場所とジャンプしたい場所の間の (アドレス空間での) 距離を知る必要があります。
- アセンブリ言語では、1 つのアドレスを「iWantToJumpHere」と呼び、「ジャンプ iWantToJumpHere」と言うことができます。
これにより、特にアドレス間の距離が変化した場合に、アセンブリの保守がはるかに容易になります。
機械語はチップが理解するもの アセンブリはあなたが理解するもの
すべてのアセンブリ命令には、同等の機械語があります。x86 には 1 バイトの命令がいくつかありますが、それらは可変長であり、最大 15 バイトの長さにすることができます (オプションのプレフィックスを含む)。
machine code bytes | x86 assembly language
8D B0 00 36 65 C4 lea esi, [eax - 1000000000]
BB 00 FC FF FF mov ebx, -1024
43 inc ebx
41 inc eax
3B CA cmp ecx,edx
C3 ret
C5 F5 72 D2 01 vpsrld ymm1,ymm2,0x1 ; AVX2
C5 F5 D4 6D 88 vpaddq ymm5,ymm1,YMMWORD PTR [ebp-0x78]
C5 CD D4 AD 68 ff ff ff vpaddq ymm5,ymm6,YMMWORD PTR [ebp-0x98]
アセンブルレベルの言語は、プログラマーがバイナリコード(機械語)の代わりにニーモニックを記述できるようにすることで、プログラミングを単純化するための最初の意識的なステップです。
アセンブリ言語は、まずアセンブラによって機械語に変換されます。これはメモリ(RAM)プロセッサ/カップに格納され、それをフェッチしてメモリからレジスタに格納し、命令セットを1つずつ追跡します。