「機械語」の版間の差分

削除された内容 追加された内容
編集の要約なし
冒頭のアセンブリ言語の説明が飛躍しすぎ。そもそもアセンブリの説明が抜けている。
6 行
注釈: 以下の内容はFedora 31に基づく。
 
アセンブリ言語のコード <syntaxhighlight lang="asm" inline>push %rbp</syntaxhighlight>は、一般的なCPUの機械語では{{code|55}}<ref name="hex">16進数。オクテットごとに半角に区切られている場合は、出現した順序をそのまま適用する。</ref>であに対応する。50番を基準にする50?60番台のオペコードはpushが使用している領域である<ref name="ia32b">[https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/IA32_Arh_Dev_Man_Vol2B_i.pdf IA-32インテルRアーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』『中巻B:命令セット・リファレンスN-Z』</ref>。
 
アセンブリ言語と機械語は異なる言語であるが、しかし原則的に全ての命令文が一対一対応しているはずなので、本wikiでは説明の都合上、アセンブリ言語で説明する。
<syntaxhighlight lang="asm" inline>call</syntaxhighlight>は{{code|e8}}<ref name="hex" />である<ref name="ia32a">[https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/IA32_Arh_Dev_Man_Vol2A_i.pdf 『IA-32インテルRアーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』 『中巻A:命令セット・リファレンスA-M』]</ref>。
 
アセンブリ命令 <syntaxhighlight lang="asm" inline>call</syntaxhighlight>は機械語 {{code|e8}}<ref name="hex" />である<ref name="ia32a">[https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/IA32_Arh_Dev_Man_Vol2A_i.pdf 『IA-32インテルRアーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』 『中巻A:命令セット・リファレンスA-M』]</ref>。
 
{{code|e8}}の直後に{{code|cw}}と呼ばれる2バイトの命令が続くため、インテル公式マニュアル<ref name="ia32a">[https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/IA32_Arh_Dev_Man_Vol2A_i.pdf 『IA-32インテルRアーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル』 『中巻A:命令セット・リファレンスA-M』]</ref>では{{code|e8 cw}}と書かれる。
 
アセンブリ命令 <syntaxhighlight lang="asm" inline>movq %rsp, %rbp</syntaxhighlight>は 機械語 {{code|48 89 E5}}<ref name="hex" />である。{{code|movq}}は32ビット同士のデータを転送する際に使用される<ref name="ia32a" />。ここで、{{code|push}}、{{code|call}}、{{code|movq}}はアセンブラである。
 
 
上記例ではLinuxの一種のFedoraで説明したが、Linuxに限らず上記例のように、どのOSやCPUの環境でも(たとえばWindwosを搭載したintel CPUのパソコンでも)、アセンブリ命令文の文字列や番号に多少の差異のある可能性はあるが、ともかくどの環境でも原則的にアセンブリ言語と機械語は一対一対応をしているはずである。
 
 
=== Windows ===