アセンブリと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
これらは、アセンブリ命令がアセンブルされたマシンコードシーケンスです。命令セットの完全なリファレンスと命令をマップする方法については、[Intelのマニュアル](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)を参照してください。マシンコード(およびその逆)。 – Michael
そのような小さなテストプログラムのアセンブリ出力を調べる場合、コンパイラは無駄なコードを最適化するかもしれないことに注意してください。この場合、おそらくjは決して使用されないためです。 – Unimportant
これは[AT&T構文](http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm)であることに注意してください。したがって、Intelのマニュアルに示されている構文とは直接対応していません。 –