web-dev-qa-db-ja.com

アセンブリ言語と機械語の関係は何ですか?

アセンブリ言語とマシン言語(同じ基になるシステム用)は本当に同じですか?これら2つの概念に違いはありますか?

29
freenight

アセンブリ言語は、機械語よりも便利なメカニズムです。アセンブリ言語では、数値演算コードの代わりにニーモニックシーケンスを使用し、手動でオフセットを計算する代わりにシンボリックラベルを使用できます。また、不正な形式のプロセッサ命令を入力するなど、本当に愚かなエラーから保護します。

それ以外の場合、アセンブリ言語は機械語と同等です。新しいプロセッサの一部の命令のニーモニックをサポートしない古いアセンブラがある場合があります。その後、プログラムに直接操作コードを挿入できます。

40
sharptooth

マシン言語は、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.
18
NoMoreZealots

本当に良い説明を見つけたので、他の人が読めるように、ここに投稿しようと考えました。

マシン言語は、コンピュータのプロセッサを制御するために使用される実際のビットであり、通常は一連の16進数(通常はバイト)として表示されます。プロセッサはこれらのビットをプログラムメモリから読み取り、ビットは次に何をするかに関する「指示」を表します。したがって、機械語は、コンピューターに命令を入力する方法を提供します(スイッチ、パンチテープ、またはバイナリファイルを介して)。

アセンブリ言語は、機械語をより人間が読める形式です。機械語を数字で表す代わりに、命令とレジスタには名前が付けられます(通常、略語、またはニーモニック、たとえばldは「ロード」を意味します)。高水準言語とは異なり、アセンブラーは機械語に非常に近いです。主な抽象化(ニーモニックを除く)は、固定メモリアドレスとコメントの代わりにラベルを使用することです。

アセンブリ言語プログラム(つまり、テキストファイル)は、アセンブラーによって機械語に翻訳されます。逆アセンブラーは逆の機能を実行します(ただし、コメントとラベルの名前はアセンブラープロセスで破棄されます)。

ソース: 機械語とアセンブリ言語の違いは何ですか?

7
Nawaz

アセンブリでは、命令はCPU命令のわかりやすい表現です。

しかし、アセンブラーは、たとえば、アドレス指定をより簡単にします。

  • 機械語では、現在地とジャンプ先との間の距離(アドレス空間内)を知る必要があります
  • アセンブリ言語では、1つのアドレスを「iWantToJumpHere」と呼び、次に「jump iWantToJumpHere」と言うことができます。

これにより、特にアドレス間の距離が変化する場合に、アセンブリの保守がはるかに簡単になります。

5
weiqure

機械語はチップが理解するものですアセンブリはあなたが理解するものです

すべてのアセンブリ命令には、同等の機械言語があります。 x86にはいくつかのシングルバイト命令がありますが、それらは可変長であり、最大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]
1
ady

アセンブリ言語は、まずアセンブラーによって機械語に変換されます。これは、メモリ(RAM)プロセッサ/カップに格納されてフェッチされ、メモリから格納されて、命令セットを1つずつ登録および追跡します。

0

マシン言語:

  1. 第一世代のプログラミング言語です
  2. アセンブリ言語よりもはるかに難しい
  3. 人間が理解しにくい
  4. 0と1の形式です
  5. 機械語はプラットフォームによって異なります
  6. 簡単に変更できない
  7. 変更をサポートしていません
  8. エラーが存在するリスクが高い
  9. バイナリコードは覚えにくい
  10. コンパイラは不要

アセンブリ言語:

  1. それは第二世代のプログラミング言語です
  2. 機械語ほど難しくない
  3. 人間が理解しやすい
  4. シンボリック命令、データ項目の説明的な名前、およびメモリの場所を使用します
  5. アセンブリ言語はプラットフォームに依存します
  6. 簡単に変更可能です
  7. サポートの変更です
  8. エラー発生のリスクが軽減されます
  9. 記憶力が高い
  10. コンパイラが必要であり、アセンブラとして知っている
0
Enaan Farhan

アセンブルレベル言語は、プログラマがバイナリコード(マシンコード)の代わりにニーモニックを記述できるようにすることで、プログラミングを単純化するための最初の意識的なステップです。

0
Pranali Desai