p1.c p2.c
2つのファイルは、実行可能ファイルを生成します
linux> gcc -Og -o p p1.c p2.c
-OGコンパイラオプションは、元のCコードの全体的な構造に沿って最適化された機械コード・レベルを生成し使用するようにコンパイラに指示します。(最適化の高レベルは、ソースコードの間の関係を理解するためのコードがひどく変形して容易になります)
3.2.1マシンレベルのコード
コンピュータシステムは、実装の詳細を隠蔽するために単純な抽象モデルで、抽象化の異なる様々な形態を使用しています。マシンレベルのプログラミングのために、ある抽象の2種類に特に重要なのは。第一:フォーマットと動作定義マシンレベルのプログラムの定義する命令セット・アーキテクチャ又は命令セット・アーキテクチャ(命令セットアーキテクチャ、ISA)プロセッサの状態を、命令のフォーマット、及び各命令の状態に影響を与えます。第二:使用してマシンレベルのプログラムのメモリアドレスの仮想アドレスは、設けられたメモリ・モデルは、非常に大きいように見えるバイトのアレイ。
1)プログラムカウンタ(一般に「PC」と呼ばれる、次の命令のメモリアドレスを表す)が%のRIPとするx86-64で実行されるように示されています。
2)整数レジスタ・ファイル16は、指定位置を含む、64ビット値が格納されています。
3)コンディションコードレジスタは、算術演算または論理命令最近実行された状態情報を保持しています。
4)ベクトル・レジスタのセットは、一つ以上の整数または浮動小数点値を保持することができます。
プログラム・メモリ・プロシージャ・コールを管理するために必要な情報の一部、オペレーティングシステムのプログラムの機械実行可能コードをランタイム・スタックを返し、(例えば、割り当てられたライブラリ関数のmallocで)ユーザに割り当てられたメモリブロック:を含みます。
機械命令は、ごく基本的な操作を実行します。
3.2.2コード例
#include<stdio.h>
/* mstore.c */
long mult2(long, long);
void multstore(long x, long y, long *dest){
long t = mult2(x, y);
*dest = t;
}
アセンブリコードを生成しますmstore.s
。
linux> gcc -Og -S mstore.c
オブジェクトコードファイルを生成しますmstore.o
。
linux> gcc -Og -o mstore.c
オブジェクトコードファイルを逆アセンブル
linux> objdump -d mstore.o
gcc
生成Intel
アセンブリコードを
linux> gcc -Og -S -masm=intel mstore.c
コードファイルCのmstore.cを書く、次のように定義された関数が含まれています。
long mult2(long,long);
void multstore(long x,long y,long*dest){
long t = mult2(x,y);
*dest = t;
}
コマンドライン「-S」オプションを使用して、あなたがmstroe.sを見ることができ、コンパイラによって生成されたアセンブリコードを見ることができます。
Linux> gcc -Og -S mstore.c
Linux> cat ./mstore.s
次のように:
そのようなコードがあります:
multstore:
pushq %rbx
movq %rdx, %rbx
call mult2
movq %rax, (%rbx)
popq %rbx
ret
multstoreは、上記の機械語命令に対応した後、最初からコードの各。例えば、pushq%のRBXがスタックにレジスタの内容を表します。
:次のような、「-C」コンパイルするためのオプションとそれらのコンパイルを使用することができます
Linux> gcc -Og -c mstore.c Linux>objdump -d mstore.o
マシンコードは、左の数である
53 48 89 D3 E8 00 00 00 00 48 89 03 5B C3
権利が同等アセンブリ言語です。
で表されるマシンコードとその分解のいくつかの特徴:
命令長1)は1から15バイトの範囲X86-64。
2デザイン命令フォーマットモード)が指定された位置から開始される機械命令に一意に復号化されたバイトであってもよいです。
バイトの配列に基づく3)逆アセンブラインデックスファイルマシンコードは、決定されたアセンブラコードです。これは、プログラムまたはアセンブリコードのソースコードにアクセスする必要はありません。
4)いくつかの微妙な違いで使用される命名規則GCC生成されたアセンブリコードを使用して解体指示を。
# include <stdio.h>
void multstore(long , long , long * );
int main(){
long d;
multstore(2 , 3 , &d);
printf("2 * 3 --> %ld/n" , d);
return 0; } long mult2(long a , long b){ long s = a * b ;
return s ; }
マシンコードを生成するための同様の方法
Linux>gcc -Og -o prog main.c mstore.c
Linux>objdump -d prog
逆アセンブラは、これは以下を含み、様々なコードシーケンスを抽出します。
以前に生成されたコードと同様にほぼmstroe.cあります。