1

コンパイラがコードをテキスト形式でコンパイルすると、テキスト コードが低レベル コードに変換されます (コードブロックの GCC の場合はアセンブリ)。

  1. Windows オペレーティング システムを必要とせずに、このコンパイル済みプログラムを自分のマシンで直接実行できますか?

  2. .exe は、プログラムへのアセンブリ命令が組み込まれたコンパイル済みファイルですか?

  3. 既に巨大なアセンブリ プログラムである場合、windows はどのようにアセンブリ プログラムを実行しますか?

  4. アセンブリ言語プログラムがバイトコードの場合、PIC バーナーで PIC を記録するときに、ヘキサコードを書き込むのはなぜですか?

  5. x64 アーキテクチャは新しい命令を持つ新しいアーキテクチャですが、それでも x86 命令が含まれていますか? 正しいか間違っているか?

  6. コンパイラによって生成された低レベル コードを読み取るにはどうすればよいですか?

ありがとう

4

2 に答える 2

2

Windows オペレーティング システムを必要とせずに、このコンパイル済みプログラムを自分のマシンで直接実行できますか?

一般的に、いいえ。プログラムはほとんどの場合、オペレーティング システムの API を使用して一般的なタスクを実行するため、OS がないと実行できません。また、ほとんどのオペレーティング システムでは、実行可能ファイルを特定のファイル形式 (Windows の場合は「PE」、Linux の場合は「ELF」、OS X の場合は「Mach-O」など) にする必要があるため、(より正確には、ローダー) は、必要な/必要なことを行うことができます。生のマシン コードを実行するには、いわゆるフラット バイナリ形式が必要です。

.exe は、プログラムへのアセンブリ命令が組み込まれたコンパイル済みファイルですか?

はい、上で述べたように、OS が必要とするいくつかのメタデータも含まれています。

既に巨大なアセンブリ プログラムである場合、windows はどのようにアセンブリ プログラムを実行しますか?

適切なアドレスでメモリにロードし、エントリ ポイントにジャンプします。

アセンブリ言語プログラムがバイトコードの場合、PIC バーナーで PIC を記録するときに、ヘキサコードを書き込むのはなぜですか?

いいえ。PIC (および一般的なすべてのマイクロコントローラー) は、生のマシン コードをバイナリ形式で保存します。ファイルに見られる 16 進表現.hexは、人間が判読できる便利な形式のデータ ストレージです。

x64 アーキテクチャは新しい命令を持つ新しいアーキテクチャですが、それでも x86 命令が含まれていますか? 正しいか間違っているか?

x86との下位互換性があり、ある程度サポートされていると思います。x86の命令セットがあります。

コンパイラによって生成された低レベル コードを読み取るにはどうすればよいですか?

おそらくテキストエディタで開くことでしょうか?これはあまりにも漠然とした質問です。ただし、生成された人間が読めるアセンブリ コードをどのように確認できるかを知りたい場合は、コンパイラのマニュアルを参照してください。gccおよびの場合clang、これは通常、-Sコンパイラ フラグを使用して実現されます。

于 2013-01-20T07:22:14.607 に答える
2

これはより小さな質問に分割する必要があるという templatetypedef のコメントには同意しますが、ここで質問のそれぞれについていくつかの指針を示すように努めます。

Windows オペレーティング システムを必要とせずに、このコンパイル済みプログラムを自分のマシンで直接実行できますか?

技術的には可能ですが、これには通常の起動手順の変更が必要です。これは、3 番目の質問に関連しています。Windows 自体は一種のアプリケーション ローダーであり、他のアプリケーションを起動する (そして他の便利なことを行う) ように設計されたアプリケーションです。現時点では、コンピュータが起動するときの最初の命令はJUMP、コンピュータに OS のメモリ ロケーションに「ジャンプ」して初期化を開始するように指示する命令である可能性があります。それ以降、OS は比較的自己完結型になります。

.exe は、プログラムへのアセンブリ命令が組み込まれたコンパイル済みファイルですか?

.exeファイルは、実行可能ファイルの 1 つのタイプにすぎません。その他にはELFMach-Oおよびその他の全範囲が含まれます。.exeファイルは、次のデータがマシンで実行可能な命令 (1 と 0) の形式であることをマシンに伝える「ヘッダー」を除いて、他のファイルと同じです。アセンブリ言語と機械語命令を混同しないでください。のようなアセンブリ命令mov %eax, %ebxは、マシンによって読み取られません。最初に を通過し、assmebler1 と 0 に変換されます。

アセンブリ言語プログラムがバイトコードの場合、PIC バーナーで PIC を記録するときに、ヘキサコードを書き込むのはなぜですか?

上記のように。Bytecodeは多くの意味を持つ言葉です。16 進数は、2 進数を表す別の (短い) 方法です。一日の終わりには、すべてがバイナリに縮小されます。

x64 アーキテクチャは、新しい命令を備えた新しいアーキテクチャですが、x86 命令がまだ残っていますか? 正しいか間違っているか?

真実。インテルは、完全な下位互換性を維持するために最善を尽くしています。これは、オペレーティング システムには必ずしも当てはまりません。

コンパイラによって生成された低レベル コードを読み取るにはどうすればよいですか?

低レベルとは、1 と 0 ではなく、アセンブリ コードを意味していると思います。最も一般的な方法は、-Sのようなコンパイラでフラグを使用することgccです。これにより、オブジェクトまたは実行可能.sファイルの代わりにアセンブリ ファイルが出力されます。.o.exe(etc)

アセンブリについて詳しく知りたい場合は、Intel プロセッサ ( ('x86') および) のGod Referenceを参照してください。非常に重いので注意してください。おそらく、Google で Windows または OS X のアセンブリ チュートリアルを探したほうがよいでしょう。NASMは無料のマルチプラットフォーム アセンブラです。ただし、他のアセンブラとは構文が少し異なります。ただし、これに着手する前に、コンピューター システムの基本 (プロセッサのしくみなど) を学習することをお勧めします。まず、DLX や MIPS などのより単純なアセンブリ言語を学習することをお勧めします。IA-32x86-64

于 2013-01-20T07:18:34.170 に答える