アセンブリコードvsマシンコードvsオブジェクトコード?


227

オブジェクトコード、マシンコード、アセンブリコードの違いは何ですか?

それらの違いの視覚的な例を挙げていただけますか?


「オブジェクトコード」の名前はどこから来たのかも知りたいです。「オブジェクト」という言葉はどういう意味ですか?それは何らかの形でオブジェクト指向プログラミングに関連していますか、それとも単なる名前の偶然ですか?
SasQ 2016


オブジェクトコードとは何なのかは尋ねていません、キャプテンオブビビッド。名前がどこから来たのか、なぜ「オブジェクト」コードと呼ばれているのかを尋ねています。
BarbaraKwarc

回答:


296

マシンコードは、CPUが直接実行できるバイナリ(1と0)コードです。あなたはテキストエディタでマシンコードのファイルを開くとしたら、あなたは印刷できない文字を含む、ごみを参照してくださいだろう(いや、ないものを印刷不能文字;))。

オブジェクトコードは、まだ完全なプログラムにリンクされていないマシンコードの一部です。完成した製品を構成するのは、特定の1つのライブラリーまたはモジュールのマシンコードです。また、完成したプログラムのマシンコードにはないプレースホルダーまたはオフセットが含まれている場合もあります。リンカは、接続のすべての一緒にこれらのプレースホルダとオフセットを使用します。

アセンブリコードはプレーンテキストであり、人間の読み取り可能なソースコードであり、ほとんどが機械語命令を含む直接1:1アナログです。これは、実際の命令、レジスタ、またはその他のリソースのニーモニックを使用して実現されます。例としては、JMPおよびMULTCPUのジャンプと乗算命令のために。マシンコードとは異なり、CPUはアセンブリコードを認識しません。アセンブラーまたはコンパイラーを使用して、アセンブリコードをマシンに変換しますが、通常、コンパイラーは、CPU命令からさらに抽象化された高水準プログラミング言語と関連していると考えられています。

完全なプログラムの構築には、アセンブリまたはC ++のような高水準言語のいずれかでプログラムのソースコードを記述することが含まれます。ソースコードはオブジェクトコードにアセンブル(アセンブリコードの場合)またはコンパイル(高水準言語の場合)され、個々のモジュールがリンクされて最終的なプログラムのマシンコードになります。非常に単純なプログラムの場合、リンク手順は必要ない場合があります。IDE(統合開発環境)などの他のケースでは、リンカーとコンパイラを一緒に呼び出すことができます。その他の場合では、複雑なmakeスクリプトまたはソリューションファイルを使用して、最終的なアプリケーションの構築方法を環境に伝えることができます。

異なる動作をするインタプリタ言語もあります。解釈された言語は、特別な解釈プログラムのマシンコードに依存しています。基本レベルでは、インタープリターがソースコードを解析し、コマンドをすぐに新しいマシンコードに変換して実行します。ランタイム環境または仮想マシンとも呼ばれる最新のインタープリターは、ソースコードのセクション全体を一度に評価し、可能な場合はキャッシュして最適化し、複雑なメモリ管理タスクを処理するという、はるかに複雑なものです。インタプリタ言語は、アセンブリコードと同様に、下位レベルの中間言語またはバイトコードにプリコンパイルすることもできます。


24
+1:いいが、やや単純化した答え-すべてのアセンブリ命令が1:1で機械命令に変換されるわけではなく、オブジェクトファイルには他のデータ(再配置情報、シンボルテーブルなど)も含まれる場合がある
Christoph

5
最初の号にイタチの単語を追加し、2番目を明確にするために編集しました。
Joel Coehoorn、2009年

2
@Christoph:「すべてのアセンブリ命令が機械語命令に1:1で変換されるわけではない」と言った場合、例を挙げてください。
Olof Forshell、2011

5
@Olof:RISCアーキテクチャは時々アセンブリレベルの仮想命令セットを提供する-例えばMIPS疑似命令(en.wikipedia.org/wiki/MIPS_architecture#Pseudo_instructions
クリストフ・

3
@Panzercrisisアセンブラによって何も追加されません。あなたが書いたものを実際の機械命令に直接翻訳したものです。また、コンパイラーによって追加されたコードを「不要」とは呼びません
Joel Coehoorn 2013年

125

他の答えは違いの良い説明を与えましたが、あなたもビジュアルを求めました。以下は、Cコードから実行可能ファイルへの移行を示す図です。


3
私はこれは本当に役立つと思いますが、「マシンコード」ラベルがありません
Alexx Roche 2013

それが実行可能コードレベルである場合、それはマシンコードと同等ですか?
CMCDragonkai

3
この図のコンテキストでは、「オブジェクトコード」はマシンコードです。
グラフィックNoob、2014

5
実際には、オブジェクトコードと実行可能コードはどちらもマシンコードです。違いは、オブジェクトコードは完成したプログラムではないということです。完全な実行可能プログラム/コードを形成するには、図に示すように、他のヘルパーライブラリ/モジュールコードと組み合わせる必要があります。
okey_on 2016年

@okeyxyzプロセッサによって直接実行されると言うのはどのレベルで正しいですか?アセンブラーの後、リンカーの後、ローダーの後、それがマイクロコントローラーに変換された後?
Celeritas 2016

49

アセンブリコードは、人間が読める機械コードの表現です。

mov eax, 77
jmp anywhere

マシンコードは純粋な16進コードです:

5F 3A E3 F1

私はあなたがオブジェクトファイルのようなオブジェクトコードを意味すると思います。これはマシンコードのバリアントですが、リンカがジャンプできるようにジャンプがパラメータ化されているという違いがあります。

アセンブラは、アセンブリコードをマシンコード(オブジェクトコード)に変換するために使用されます。リンカは、いくつかのオブジェクト(およびライブラリ)ファイルをリンクして、実行可能ファイルを生成します。

私はかつてアセンブラープログラムを純粋な16進数(アセンブラーなし)で書いたことがありましたが、幸いにもこれは古き良き(古代)6502にさかのぼります。


76
いやいやいやいや。マシンコードが16進コードではありません。純粋なバイナリです。16進コードは、バイナリの便利な表現にすぎません。
ブルトン

56
私たちが本当に極端なことをしているのなら、それはバイナリではなく、回路に蓄えられた電気の量です。;-)
Toon Krijthe 2009年

17
はい、もちろん。16進数と "マシンコード"との間には関係がありますが、16進数マシンコードであると言うの正確ではありません。私が言いたいのはそれだけです。
ブルトン語

9
@ブルトンそういう意味では「16進コード」なんてありませんよね?「16進コード」は、マシンコードを表示するための単なる方法です。マシンコードは、16進数、2進数、8進数、10進数など、好きな方法で表示できます。また、その意味でも、「バイナリコード」はありません。繰り返しになりますが、「バイナリコード」はマシンコードを表示する方法の1つにすぎません。
Utku、2015年

9
@Bretonあなたが言うことは実際にはあまり意味がありません。.バイナリは16進数と同じように表現する方法です。16進数でない場合も2進数ではありません。
Koray Tugay

18

8B 5D 32 マシンコードです

mov ebx, [ebp+32h] アセンブリです

lmylib.so含む8B 5D 32はオブジェクトコード


8

まだ言及されていない1つの点は、いくつかの異なるタイプのアセンブリコードがあることです。最も基本的な形式では、命令で使用されるすべての数値は定数として指定する必要があります。例えば:

$ 1902:BD 37 14:LDA $ 1437、X
$ 1905:85 03:STA $ 03
$ 1907:85 09:STA $ 09
1909ドル:CA:DEX
$ 190A:10:BPL $ 1902

上記のコードは、Atari 2600カートリッジのアドレス$ 1900に格納されている場合、アドレス$ 1437から始まるテーブルからフェッチされたさまざまな色の行数を表示します。一部のツールでは、上の行の右端とともにアドレスを入力すると、中央の列に表示されている値がメモリに保存され、次の行が次のアドレスで開始されます。その形式でコードを入力することは、16進数で入力するよりもはるかに便利ですが、すべての正確なアドレスを知る必要がありました。

ほとんどのアセンブラでは、シンボリックアドレスを使用できます。上記のコードは次のように記述されます。

rainbow_lp:
  lda ColorTbl、x
  sta WSYNC
  sta COLUBK
  dex
  bpl rainbow_lp

アセンブラーはLDA命令を自動的に調整して、ラベルColorTblにマップされたアドレスを参照するようにします。このスタイルのアセンブラを使用すると、すべてのアドレスを手動でキー入力して管理する必要がある場合よりも、コードの記述と編集がはるかに簡単になります。


1
+1。さらにもう1つ、異なるアセンブリ言語構文あり、最も有名なのはIntelとAT&Tです。
informatik01

1
@ informatik01:Intel 8080ニーモニック対Zilog Z80はどうですか?IntelとAT&Tの構文戦争よりも前からあると思います。
スーパーキャット2014年

議論していないが、私はその側面(異なる構文)について述べ、2つの最も人気のある/よく知られている/有名な構文の例を示した。
informatik01

4

ソースコード、アセンブリコード、マシンコード、オブジェクトコード、バイトコード、実行可能ファイル、ライブラリファイル。

多くの場合、これらの用語はすべて、相互に排他的であると考えるため、非常に混乱します。図を参照して、それらの関係を理解し​​てください。各用語の説明を以下に示します。


コードの種類


ソースコード

人間が読める(プログラミング)言語での指示


高レベルのコード

高水準(プログラミング)言語で記述された命令(
C、C ++、Javaプログラムなど)


アセンブリコード

アセンブリ言語(一種の低水準プログラミング言語)で記述された命令。コンパイルプロセスの最初のステップとして、高レベルのコードがこの形式に変換されます。これは、実際のマシンコードに変換されるアセンブリコードです。ほとんどのシステムでは、これら2つのステップはコンパイルプロセスの一部として自動的に実行されます。
例:program.asm


オブジェクトコード

コンパイルプロセスの結果。マシンコードまたはバイトコードの形式である場合があります。
例:file.o


機械コード

機械語での説明。
例:a.out


バイトコード

JVMなどのインタプリタで実行できる中間形式の命令。
例:Javaクラスファイル


実行可能ファイル

リンクプロセスの製品。これらは、CPUが直接実行できるマシンコードです。
たとえば、.exeファイル。

一部のコンテキストでは、バイトコードまたはスクリプト言語の命令を含むファイルも実行可能と見なされる場合があることに注意してください。


ライブラリファイル

一部のコードは、再利用性などのさまざまな理由でこの形式にコンパイルされ、後で実行可能ファイルによって使用されます。


1
人間が書いたり保守したりするコードの厳密な意味で、すべてのアセンブリが本当にソースであるとは限らないと私は主張します。多くの場合、ソースからマシンで生成され、人間が使用することを意図したものではありません(たとえば、gccは、cc1実行可能ファイル内に組み込みのアセンブラーを持たず、別のアセンブラーに供給するasmテキストを実際に作成します)。一部のasmは単なるソースであり、ソースではないため、asmサークルは「ソース」サークルの左側に突き出ているはずです。もちろんそれは決してオブジェクトコードではありませんが、いくつかのasmはソースからオブジェクトファイルへの途中のステップです。
Peter Cordes

@PeterCordesコメントありがとうございます。あなたがgccの働きについてあなたが言ったことを私は知りませんでした。しかし、完全にあなたに同意することができれば私は恐れています。つまり、ソースコードは人間が読めるプログラミング言語を使用して書かれたものです。人間によって記述または維持される場合とされない場合があります。トランスコンパイラに気づくと思います。あなたの観点から、そのようなコンパイラの製品をどのカテゴリに置きますか?ソースコードか何か?私が間違っている場合は私を修正してください。さらなるコメントはいつでも歓迎します。
バートラムギルフォイル

1

ここでは、アセンブリコードについて説明します

「アセンブリ言語は、コンピュータをプログラミングするための低レベル言語です。特定のCPUアーキテクチャをプログラムするために必要な数値マシンコードおよびその他の定数の記号表現を実装します。」

マシンコードはここで議論されます

「機械コードまたは機械語は、コンピュータの中央処理装置によって直接実行される命令とデータのシステムです。」

基本的に、アセンブラーコードは言語であり、アセンブラー(コンパイラーに類似)によってオブジェクトコード(CPUが実行するネイティブコード)に変換されます。


1

これらが主な違いだと思います

  • コードの読みやすさ
  • あなたのコードが何をしているかの制御

読みやすさにより、わずかな労力で作成されてから6か月後にコードが改善または置き換えられる可能性があります。一方、パフォーマンスが重要な場合は、低レベル言語を使用して、本番環境で使用する特定のハードウェアをターゲットにして、より速い実行。

今日のIMOのコンピューターは、プログラマーがOOPで高速に実行できるほど高速です。


1

アセンブリは、人間が理解できる短い説明的な用語であり、CPUが実際に使用するマシンコードに直接変換できます。

人間にはある程度理解できるが、アセンブラはまだ低レベルです。有用なことを行うには多くのコードが必要です。

したがって、代わりに、C、BASIC、FORTANなどの高レベルの言語を使用します(私は自分自身とデートしたことを知っています)。コンパイルすると、オブジェクトコードが生成されます。初期の言語では、オブジェクトコードとして機械語が使用されていました。

現在、JAVAやC#などの多くの言語は、通常、マシンコードではなく、実行時に簡単に解釈してマシンコードを生成するバイトコードにコンパイルされます。


JavaとC#に関するコメント-どちらもJust In Timeコンパイルを使用しているので、バイトコードは解釈されません。C#(一般に.NET)は中間言語(IL)にコンパイルされ、その後、ターゲットCPUのネイティブマシン言語にJITされます。
クレイグ・シアラー

-1

プログラムのソースファイルはオブジェクトファイルにコンパイルされ、リンカーはそれらのオブジェクトファイルをリンクして、アーキテクチャのマシンコードを含む実行可能ファイルを生成します。

オブジェクトファイルと実行可能ファイルの両方に、テキストエディターで開いたときに、印刷可能な文字と印刷できない文字の形式のアーキテクチャのマシンコードが含まれます。

それにもかかわらず、ファイル間の二分は、オブジェクトファイルが未解決の外部参照(たとえばなど)を含む可能性があるということですprintf。したがって、他のオブジェクトファイルに対してリンクする必要がある場合があります。つまり、C / C ++ランタイムライブラリなどの他のオブジェクトファイルとリンクして適切な実行可能実行可能ファイルを取得するには、未解決の外部参照を解決する必要があります。 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.