2016-04-02 6 views
1

アセンブリとCコードを理解しています。 私は以下のCプログラムを持っており、オブジェクトファイルのみを生成するようにコンパイルされています。私は、次のコマンドを実行しCコードで解読された数値は何ですか?

#include <stdio.h> 
int main() 
{ 
    int i = 10; 
    int j = 22 + i; 
    return 0; 
} 

objdump -S myprogram.o 

上記のコマンドの出力は次のとおりです。

前ニーモニックコマンド すなわち "83 EC 10" の前に数の数値が意味する何
objdump -S testelf.o 

testelf.o:  file format elf32-i386 


Disassembly of section .text: 

00000000 <main>: 
#include <stdio.h> 

int main() 
{ 
    0: 55      push %ebp 
    1: 89 e5     mov %esp,%ebp 
    3: 83 ec 10    sub $0x10,%esp 
    int i = 10; 
    6: c7 45 f8 0a 00 00 00 movl $0xa,-0x8(%ebp) 
    int j = 22 + i; 
    d: 8b 45 f8    mov -0x8(%ebp),%eax 
    10: 83 c0 16    add $0x16,%eax 
    13: 89 45 fc    mov %eax,-0x4(%ebp) 

    return 0; 
    16: b8 00 00 00 00   mov $0x0,%eax 
} 
    1b: c9      leave 
    1c: c3      ret 

」 「sub」コマンドまたは 「movl」コマンドの前に「c7 45 f8 0a 00 00 00」

私はこのコードをコンパイルするには、次のプラットフォームを使用しています:

$ lscpu 
Architecture:   i686 
CPU op-mode(s):  32-bit 
Byte Order:   Little Endian 
CPU(s):    1 
On-line CPU(s) list: 0 
Thread(s) per core: 1 
Core(s) per socket: 1 
Socket(s):    1 
Vendor ID:    GenuineIntel 
+3

これらは、アセンブリ命令がアセンブルされたマシンコードシーケンスです。命令セットの完全なリファレンスと命令をマップする方法については、[Intelのマニュアル](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)を参照してください。マシンコード(およびその逆)。 – Michael

+0

そのような小さなテストプログラムのアセンブリ出力を調べる場合、コンパイラは無駄なコードを最適化するかもしれないことに注意してください。この場合、おそらくjは決して使用されないためです。 – Unimportant

+1

これは[AT&T構文](http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm)であることに注意してください。したがって、Intelのマニュアルに示されている構文とは直接対応していません。 –

答えて

1

これらは、x86オペコードです。上記のコメントに記載されているもの以外の詳細なリファレンスはhereです。

たとえば、movl $0xa,-0x8(%ebp)の前のc7 45 f8 0a 00 00 00は、opcodeバイトの16進数の値です。 CPUは、スタックフレームのベースポインタの8バイト上の現在のスタックにあるアドレスに10進数の即値(4バイト値として)を移動するようCPUに指示します。コード実行時に、Cソースコードの変数iがあります。スタックの上端はスタックの下端よりも低いメモリアドレスにあるため、ベースから負の方向を移動するとスタックが上に移動します。

オペコードはmovデータを意味し、EFLAGSレジスタの演算キャリーフラグをクリアします。詳細については、referenceを参照してください。

残りのコードはimmediate valueです。リトル・エンディアン・システムを使用しているので、数字の最下位バイトが最初にリストされ、10進数が16進数で0x0aで、0x0000000aの4バイト値を持つ10小数点が0a 00 00 00として格納されます。