I was searching about the behaviour of array allocation in C. I know in details that the allocation of a simple array like int array[10] runs in compilation time. I'm trying to disassemble a simple code to know what happens in the backstage when i ask to allocate some array (inside a scope like main) with size defined by another variable that will be read sometime before the array declaration. I'm using a code like this:
#include <stdio.h> int main(){ int n; scanf("%d", &n); int arr[n], int x[10]; return 0; } Here, the array x is just to see the difference in the .s file. I'm using a OS X and typing the command gcc -c test.c to get the file test.c and using the command objdump -d test.o to see the disassemble. Here is the output:
teste.o: file format Mach-O 64-bit x86-64 Disassembly of section __TEXT,__text: _main: 0: 55 pushq %rbp 1: 48 89 e5 movq %rsp, %rbp 4: 48 83 ec 60 subq $96, %rsp 8: 48 8d 3d 88 00 00 00 leaq 136(%rip), %rdi f: 48 8d 75 c8 leaq -56(%rbp), %rsi 13: 48 8b 05 00 00 00 00 movq (%rip), %rax 1a: 48 8b 00 movq (%rax), %rax 1d: 48 89 45 f8 movq %rax, -8(%rbp) 21: c7 45 cc 00 00 00 00 movl $0, -52(%rbp) 28: b0 00 movb $0, %al 2a: e8 00 00 00 00 callq 0 <_main+0x2F> 2f: b9 04 00 00 00 movl $4, %ecx 34: 89 cf movl %ecx, %edi 36: 48 89 e6 movq %rsp, %rsi 39: 48 89 75 c0 movq %rsi, -64(%rbp) 3d: 89 45 b4 movl %eax, -76(%rbp) 40: e8 00 00 00 00 callq 0 <_main+0x45> 45: 48 8d 3d 4e 00 00 00 leaq 78(%rip), %rdi 4c: be 05 00 00 00 movl $5, %esi 51: 48 89 45 b8 movq %rax, -72(%rbp) 55: b0 00 movb $0, %al 57: e8 00 00 00 00 callq 0 <_main+0x5C> 5c: c7 45 cc 00 00 00 00 movl $0, -52(%rbp) 63: 48 8b 7d c0 movq -64(%rbp), %rdi 67: 48 89 fc movq %rdi, %rsp 6a: 8b 4d cc movl -52(%rbp), %ecx 6d: 48 8b 3d 00 00 00 00 movq (%rip), %rdi 74: 48 8b 3f movq (%rdi), %rdi 77: 48 8b 55 f8 movq -8(%rbp), %rdx 7b: 48 39 d7 cmpq %rdx, %rdi 7e: 89 45 b0 movl %eax, -80(%rbp) 81: 89 4d ac movl %ecx, -84(%rbp) 84: 0f 85 08 00 00 00 jne 8 <_main+0x92> 8a: 8b 45 ac movl -84(%rbp), %eax 8d: 48 89 ec movq %rbp, %rsp 90: 5d popq %rbp 91: c3 retq 92: e8 00 00 00 00 callq 0 <_main+0x97> Is there some evidence in this generated file that shows to me what happens with the variable arr[n]? I don't know how to read it, despiste having some notion of what is written.
Some of my references to this question: What does “Memory allocated at compile time” really mean?, Array allocation in compiler, Using GCC to produce readable assembly?, Array[n] vs Array[10] - Initializing array with variable vs real number