機械語

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

W65C816S シングルボードコンピューターの機械語モニター。コードの逆アセンブル、プロセッサレジスタ、メモリダンプを表示します。

コンピュータプログラミングは、機械語は、コンピュータの中央処理装置(CPU)を制御するために使用される機械語命令構成される低レベルのプログラミング言語です。各命令により、CPUは、CPUのレジスタまたはメモリ内の1つまたは複数のデータユニットに対して、ロード、ストア、ジャンプ、または算術論理演算ユニット(ALU)操作などの非常に特殊なタスクを実行します。

マシンコードは厳密に数値言語であり、可能な限り高速に実行されるように設計されており、コンパイルまたはアセンブルされたコンピュータプログラムの最下位レベルの表現、またはプリミティブでハードウェアに依存するプログラミング言語と見なすことができます。プログラムを機械語で直接記述することは可能ですが、個々のビットを管理し、数値アドレスと定数を手動で計算することは、面倒でエラーが発生しやすくなります。このため、最近のコンテキストでは、プログラムがマシンコードで直接記述されることはめったにありませんが、低レベルのデバッグ、プログラムのパッチ適用(特に、アセンブラソースが利用できない場合)、およびアセンブリ言語の逆アセンブルのために実行される場合があります。

今日の実用的なプログラムの大部分は、高級言語またはアセンブリ言語で書かれています。次に、ソースコードは、コンパイラアセンブラリンカなどのユーティリティによって実行可能なマシンコードに変換されます。ただし、解釈されたプログラム[nb 1]は、マシンコードに変換されません。ただし、ソースコードの命令を実行するエグゼキュータまたはプロセッサと見なされるインタプリタ自体は、通常、直接実行可能なマシンコード(アセンブリまたは高級言語のソースコードから生成される)で構成されます。

マシンコードは、定義上、プログラマーに見えるプログラミングの詳細の最低レベルですが、内部的に多くのプロセッサーはマイクロコードを使用するか、マシンコード命令を最適化してマイクロオペレーションのシーケンスに変換します。これは通常、マシンコードとは見なされません。

命令セット

すべてのプロセッサまたはプロセッサフ​​ァミリには、独自の命令セットがあります。命令は、マシンコマンドに対応するビット、数字、または文字のパターンです。したがって、命令セットは、(ほとんど)同じアーキテクチャを使用するプロセッサのクラスに固有です。後継または派生プロセッサの設計には、多くの場合、前任者の命令が含まれ、新しい追加の命令が追加される場合があります。場合によっては、後継の設計によって一部の命令コードの意味が中止または変更され(通常は新しい目的で必要になるため)、コードの互換性にある程度影響します。互換性のあるプロセッサでさえ、一部の命令ではわずかに異なる動作を示す場合がありますが、これが問題になることはめったにありません。システムは、メモリの配置、オペレーティングシステム、または周辺機器プログラムは通常このような要因に依存しているため、同じタイプのプロセッサが使用されている場合でも、通常、異なるシステムは同じマシンコードを実行しません。

プロセッサの命令セットには、同じ長さのすべての命令が含まれる場合と、可変長の命令が含まれる場合があります。パターンがどのように編成されるかは、特定のアーキテクチャと命令のタイプによって異なります。ほとんどの命令には、基本的な命令タイプ(算術、論理、ジャンプなど)、演算(追加や比較など)、およびオペランドのタイプを指定できるその他のフィールドを指定する1つ以上のオペコードフィールドがあります( )、アドレッシングモード、アドレッシングオフセットまたはインデックス、またはオペランド値自体(命令に含まれるこのような定数オペランドはイミディエートと呼ばれます)。[1]

すべてのマシンまたは個々の命令に明示的なオペランドがあるわけではありません。アキュムレータマシンには、結合された左オペランドがあり、ほとんどの算術命令に対して暗黙のアキュムレータが生成されます。他のアーキテクチャ(8086やx86ファミリなど)には、一般的な命令のアキュムレータバージョンがあり、アキュムレータは、より長い命令によって一般的なレジスタの1つと見なされます。スタックマシンは、そのオペランドのほとんどまたはすべてが暗黙的なスタック上にあります。特殊用途の命令にも明示的なオペランドがないことがよくあります(たとえば、x86アーキテクチャのCPUIDは、4つの暗黙的な宛先レジスタに値を書き込みます)。明示的オペランドと暗黙的オペランドのこの区別は、コードジェネレーター、特にレジスタ割り当てで重要です。とライブ範囲追跡部品。優れたコードオプティマイザは、暗黙的および明示的なオペランドを追跡できます。これにより、定数の伝播、レジスタの定数畳み込み(定数式をその定数に置き換えることで解放された定数式の結果が割り当てられたレジスタ)、およびその他のコード拡張が可能になります。

プログラム

コンピュータプログラムは、中央処理装置(CPU)で実行できる命令のリストですプログラムの実行は、プログラムを実行しているCPUが問題を解決し、結果を達成するために行われます。単純なプロセッサは命令を次々に実行できますが、スーパースカラープロセッサは多くの命令を同時に実行できます。

プログラムフローは、実行を次の数値的に連続したアドレス以外のアドレス(したがって命令)に転送する特別な「ジャンプ」命令の影響を受ける可能性があります。これらの条件付きジャンプが発生するかどうかは、値が別の値より大きい、小さい、または等しいなどの条件に依存します。

アセンブリ言語

アセンブリ言語と呼ばれる、はるかに人間に優しい機械語の表現では、命令の数値を直接使用するのではなく、ニーモニックコードを使用して機械語命令を参照し、記号名を使用して格納場所や場合によってはレジスタを参照します。たとえば、Zilog Z80プロセッサでは、CPUにプロセッサレジスタ00000101をデクリメントさせるマシンコードは、アセンブリ言語ではとして表されます。 B DEC B

MIPSアーキテクチャは、命令が常に32ビット長であるマシンコードの特定の例を提供します一般的なタイプの命令は、上位6ビットのop(操作)フィールドによって指定されます。Jタイプ(ジャンプ)およびIタイプ(即時)の命令は、opによって完全に指定されます。Rタイプ(レジスタ)命令には、正確な操作を決定するための追加のフィールド関数が含まれています。これらのタイプで使用されるフィールドは次のとおりです。

   6 5 5 5 56ビット
[op | rs | rt | rd | shamt | funct] R-type
[op | rs | rt | アドレス/即時] Iタイプ
[op | ターゲットアドレス] Jタイプ

rsrt、およびrdは、レジスタオペランドを示します。shamtはシフト量を与えます。アドレスまたはイミディエートフィールドには、オペランドが直接含まれています

たとえば、レジ​​スタ1と2を追加し、その結果をレジスタ6に配置すると、次のようにエンコードされます。

[op | rs | rt | rd | shamt | 機能]
    0 1 2 6 0 3210進数
 000000 00001 00010 00110 00000100000バイナリ

レジスタ3にリストされている位置の後のメモリセル68セルから取得した値をレジスタ8にロードします。

[op | rs | rt | アドレス/即時]
   35 3 868小数
 100011 00011 01000 00000 00001000100バイナリ

アドレス1024にジャンプします。

[op | ターゲットアドレス]
    21024の10進数
 000010 00000 00000 00000 10000000000バイナリ

重複する指示

可変長命令セットを備えたプロセッサアーキテクチャ[2]Intelx86プロセッサフ​​ァミリなど)では、 Kruskal Countとして知られる制御フロー再同期現象の範囲内[3] [2]可能である場合があります。 2つのコードパスがオペコードシーケンスの共通フラグメントを共有するように、結果のコードを意図的に配置するオペコードレベルのプログラミング。これらは、重複する命令重複するオペコード重複するコード重複するコード命令の切断、または命令の途中にジャンプすることと呼ばれます、および重ね合わせの形式を表します。[4] [5] [6]

1970年代と1980年代には、メモリスペースを維持するために重複する命令が使用されることがありました。1つの例は、 MicrosoftAltair BASICでのエラーテーブルの実装でインターリーブされた命令が相互に命令バイトを共有していました。[7] [2] [4]この手法は今日ではほとんど使用されていませんが、ブートローダーの実装など、バイトレベルでサイズの極端な最適化が必要な領域に頼る必要がある場合があります。ブートセクタ[nb 2]

また、分解や改ざんに対する対策として、コードの難読化手法として使用されることもあります。[2]

この原理は、複数の命令セットと互換性のないプロセッサプラットフォームで実行する必要が あるファットバイナリの共有コードシーケンスでも利用されます。

このプロパティは、既存のコードリポジトリでガジェットと呼ばれる意図しない命令を見つけるためにも使用され、 return-to-libc攻撃などのエクスプロイトのコードインジェクションの代わりにリターン指向プログラミングで使用されます。[8] [2]

マイクロコードとの関係

一部のコンピュータアーキテクチャでは、マシンコードは、マイクロコードと呼ばれるさらに基本的な基盤となるレイヤーによって実装され、基盤となるデータフローが大きく異なるコンピュータのさまざまなモデルのラインまたはファミリ全体に共通の機械語インターフェイスを提供しますこれは、異なるモデル間での機械語プログラムの移植を容易にするために行われます。この使用例は、IBM System / 360ファミリーのコンピューターとその後継機です。データフローパスの幅は8ビットから64ビット以上ですが、それでも、ライン全体で機械語レベルで共通のアーキテクチャを提供します。

マイクロコードを使用してエミュレーターを実装すると、コンピューターはまったく異なるコンピューターのアーキテクチャーを提示できます。System / 360ラインはこれを使用して、以前のIBMマシンから新しいコンピューターファミリー(IBM S / 360モデル40上の IBM1401 / 1440/1460エミュレーターなど)にプログラムを移植できるようにしました。

バイトコードとの関係

マシンコードは、一般にバイトコード(pコードとも呼ばれます)とは異なります。バイトコードは、インタープリターによって実行されるか、それ自体がマシンコードにコンパイルされてより高速な(直接)実行されます。例外は、Javaプロセッサの場合のように、プロセッサが特定のバイトコードをマシンコードとして直接使用するように設計されている場合です。

マシンコードとアセンブリコードは、言語機能またはライブラリのプラットフォームに依存する部分を指す場合、ネイティブコードと呼ばれることがあります。[9]

メモリへの保存

ハーバードアーキテクチャは、コード(命令)とデータ用に物理的に分離されたストレージと信号経路を備えたコンピュータアーキテクチャです。現在、ほとんどのプロセッサは、パフォーマンス上の理由からこのような個別の信号経路を実装していますが、修正ハーバードアーキテクチャを実装しているため、ディスクストレージから実行可能プログラムをデータとしてロードして実行するなどのタスクをサポートできます。ハーバードアーキテクチャは、データとコードが同じメモリに格納され、プロセッサによって読み取られてコンピュータがコマンドを実行できるように するフォンノイマンアーキテクチャとは対照的です。

プロセスの観点からはコードスペースは、実行中のコードが格納されているアドレススペースの一部です。マルチタスクシステムでは、これはプログラムのコードセグメントと通常は共有ライブラリで構成されます。マルチスレッド環境では、1つのプロセスの異なるスレッドがデータスペースとともにコードスペースを共有します。これにより、プロセススイッチングと比較して 、コンテキストスイッチングのオーバーヘッドが大幅に削減されます。

人間による読みやすさ

Pamela Samuelsonは、マシンコードが非常に読めないため、米国著作権局が特定のエンコードされたプログラムがオリジナルの著作物であるかどうかを識別できないと書いています。[10]ただし、米国著作権局コンピュータプログラムの著作権登録を許可しており[11] 、プログラムの機能を人間が理解しやすくするために、プログラムのマシンコードを逆コンパイルできる場合があります。[12]ただし、逆コンパイラーまたは逆アセンブラーの出力にはコメントとシンボリック参照がないため、出力はオブジェクトコードよりも読みやすいかもしれませんが、元のソースコードよりも難しい場合があります。この問題は、ソースコードがファイルに含まれている SQUOZEのようなオブジェクトコード形式には存在しません。

認知科学のダグラス・ホフスタッター教授は、機械語と遺伝暗号を比較し、「機械語で書かれたプログラムを見るのは、原子ごとにDNA分子を見るのと漠然と似ている」と述べています。[13]

も参照してください

メモ

  1. ^ BASICの多くのバージョン、特に初期のバージョン、 Smalltalk MATLAB Perl Python Ruby、その他の特別な目的またはスクリプト言語など。
  2. ^ 例として、 DR-DOS MBRブートセクター(パーティションテーブルBIOSパラメーターブロックも保持し、コード用にそれぞれ446バイト未満を残します)は、従来、ファイルシステム内のブートファイルを自分で見つけることができました。ファイルシステムの最初の2つのディレクトリエントリとIBMBIO.COMの最初の3つのセクターを占有するためにシステムファイルに依存していたMS-DOS / PC DOSの対応するものとは対照的に、全体としてメモリにロードしデータ領域の先頭で、ファイルの残りの部分をメモリにロードするためのセカンダリローダーを含む連続したセクターに格納されます(これらすべての条件を処理するためにSYSが必要です)。FAT32LBAのサポートが追加されたとき、 Microsoftは386命令を要求するように切り替え、コードサイズの理由でブートコードを2つのセクターに分割しました。これは、DR-DOSの場合、逆方向に壊れてしまうため、従うオプションがありませんでした。マルチブートおよびチェーンロードシナリオのその他のオペレーティングシステム、および古いPC代わりに、DR-DOS 7.07自己変更コード頼ったブートセクター、機械語でのオペコードレベルのプログラミング、(文書化された)副作用の制御された利用、マルチレベルのデータ/コードのオーバーラップ、アルゴリズムによる折りたたみ技術により、512バイトの物理セクターにすべてを適合させることができます。拡張機能のいずれかを放棄します。

参考文献

  1. ^ Kjell、Bradley。「即時オペランド」
  2. ^ a b c d e Jacob、Matthias; Jakubowski、Mariusz H。; ベンカテサン、ラマラスナム(2007年9月20〜21日)。統合バイナリ実行に向けて:重複した命令エンコーディングを使用した忘却型ハッシュの実装(PDF)マルチメディアとセキュリティに関する第9回ワークショップ(MM&Sec '07)の議事録。米国テキサス州ダラス:Association for ComputingMachinerypp。129–140。CiteSeerX10.1.1.69.5258_ 土井10.1145 /1288869.1288887ISBN   978-1-59593-857-2S2CID14174680 _ 2018-09-04のオリジナルからアーカイブ (PDF)2021年12月25日取得(12ページ)
  3. ^ ラガリアス、ジェフリーC。; 雨、エリック; ヴァンダーベイ、ロバートJ.(2009)[2001-10-13]。ブラム、スティーブン; Gehrlein、William V。; ロバーツ、フレッドS.(編)。クラスカル法(PDF)好み、選択、秩序の数学。ピーターJ.フィッシュバーンに敬意を表してエッセイベルリン/ハイデルベルク、ドイツ:Springer-Verlagpp。371–391。arXivmath / 0110143ISBN  978-3-540-79127-02021年12月25日のオリジナルからアーカイブ (PDF)2021年12月25日取得(22ページ)
  4. ^ a b "x86での意図しない指示"ハッカーニュース2021年。2021年12月25日のオリジナルからアーカイブ2021年12月24日取得
  5. ^ キンダー、ヨハネス(2010-09-24)。x86実行可能ファイルの静的分析[ x86MaschinenspracheのStatischeAnalyze von Programmen ] (PDF)(論文)。ドイツ、ミュンヘン:ダルムシュタット工科大学D17。2020-11-12にオリジナルからアーカイブされました2021年12月25日取得(199ページ)
  6. ^ 「「重複する指示」の難読化とは何ですか?」リバースエンジニアリングスタック交換2013-04-07。2021年12月25日にオリジナルからアーカイブされました2021年12月25日取得
  7. ^ ゲイツ、ウィリアム "ビル"ヘンリー個人的なコミュニケーション(NB。ジェイコブらによると。)
  8. ^ Shacham、Hovav(2007)。骨の上の無実の肉の幾何学:関数呼び出しなしでlibcに戻る(x86上)(PDF)ACM、CCS2007の議事録。ACMPress2021年12月15日のオリジナルからアーカイブ(PDF)2021年12月24日取得
  9. ^ 「マネージド、アンマネージド、ネイティブ:これはどのようなコードですか?」developer.com2003-04-28 2008年9月2日取得
  10. ^ サミュエルソン、パメラ(1984年9月)。「CONTUの再考:機械可読形式のコンピュータプログラムの著作権保護に対する訴訟」デュークロージャーナル1984(4):663–769。土井10.2307 / 1372418JSTOR1372418_ PMID10268940_  
  11. ^ 「コンピュータプログラムの著作権登録」(PDF)米国著作権局2008年8月2014年2月23日取得
  12. ^ 「逆コンパイルとは何ですか?-WhatIs.comからの定義」WhatIs.com 2016年12月26日取得
  13. ^ ホフスタッター、ダグラスR.(1980)。ゲーデル、エッシャー、バッハ:永遠の黄金の編組p。290。

さらに読む