c言語のアセンブリの基本について教えてください。
質問は#のあとに書いてあります。
よろしくお願いします。
CPU他情報
description: Computer
width: 32 bits
*-core
description: Motherboard
physical id: 0
*-memory
description: System memory
physical id: 0
size: 1988MiB
Architecture: i686
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 15
Model name: Intel(R) Core(TM)2 Duo CPU L7100 @ 1.20GHz
Stepping: 11
CPU MHz: 1201.000
CPU max MHz: 1201.0000
CPU min MHz: 800.0000
BogoMIPS: 2394.07
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
ソース
#include <stdio.h>
int main()
{
int i;
for (i=0; i<10; i++)
{
printf("Hello, World!\n");
}
return 0;
}
コマンド
gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2)
$ gcc -o firstprog firstprog.c
$ objdump -D firstprog | grep -A70 main.:
0804840b <main>:
1 804840b: 8d 4c 24 04 lea 0x4(%esp),%ecx
2 804840f: 83 e4 f0 and $0xfffffff0,%esp #なぜこれをしないといけないのか?
3 8048412: ff 71 fc pushl -0x4(%ecx) ##これと対になるのはなにか?
4 8048415: 55 push %ebp
5 8048416: 89 e5 mov %esp,%ebp
6 8048418: 51 push %ecx ##これと対になるのはなにか?
7 8048419: 83 ec 14 sub $0x14,%esp ##なぜ10行目があるのに、これをしないといけないのか?
8 804841c: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp)
9 8048423: eb 14 jmp 8048439 <main+0x2e>
10 8048425: 83 ec 0c sub $0xc,%esp
11 8048428: 68 d0 84 04 08 push $0x80484d0
12 804842d: e8 ae fe ff ff call 80482e0 puts@plt
13 8048432: 83 c4 10 add $0x10,%esp
14 8048435: 83 45 f4 01 addl $0x1,-0xc(%ebp)
15 8048439: 83 7d f4 09 cmpl $0x9,-0xc(%ebp)
16 804843d: 7e e6 jle 8048425 <main+0x1a>
17 804843f: b8 00 00 00 00 mov $0x0,%eax ##これはなにをしてるのか?
18 8048444: 8b 4d fc mov -0x4(%ebp),%ecx##これはなにをしてるのか?
19 8048447: c9 leave
20 8048448: 8d 61 fc lea -0x4(%ecx),%esp
21 804844b: c3 ret
