#include <stdio.h>
int main()
{
int i = 3;
int j = 4;
int *p = &j;
*(p+1) = 7;
#if 1
// addr &i is higher than &j
printf("%d, %d\n", i, j); // prints 7, 4
#else
// addr &j is higher than &i
printf("%d, %d\n%p, %p\n", i, j, &i, &j); // prints 3, 4
#endif
return 0;
}
gdb a.out -batch -ex 'disassemble/s main'
Dump of assembler code for function main:
a.c:
4 {
0x0000000000001169 <+0>: endbr64
0x000000000000116d <+4>: push %rbp
0x000000000000116e <+5>: mov %rsp,%rbp
0x0000000000001171 <+8>: sub $0x20,%rsp
0x0000000000001175 <+12>: mov %fs:0x28,%rax
0x000000000000117e <+21>: mov %rax,-0x8(%rbp)
0x0000000000001182 <+25>: xor %eax,%eax
5 int i = 3;
0x0000000000001184 <+27>: movl $0x3,-0x14(%rbp)
6 int j = 4;
0x000000000000118b <+34>: movl $0x4,-0x18(%rbp)
7 int *p = &j;
0x0000000000001192 <+41>: lea -0x18(%rbp),%rax
0x0000000000001196 <+45>: mov %rax,-0x10(%rbp)
8 *(p+1) = 7;
0x000000000000119a <+49>: mov -0x10(%rbp),%rax
0x000000000000119e <+53>: add $0x4,%rax
0x00000000000011a2 <+57>: movl $0x7,(%rax)
9 #if 1
10 // addr &i is higher than &j
11 printf("%d, %d\n", i, j); // prints 7, 4
0x00000000000011a8 <+63>: mov -0x18(%rbp),%edx
0x00000000000011ab <+66>: mov -0x14(%rbp),%eax
0x00000000000011ae <+69>: mov %eax,%esi
0x00000000000011b0 <+71>: lea 0xe4d(%rip),%rdi # 0x2004
0x00000000000011b7 <+78>: mov $0x0,%eax
0x00000000000011bc <+83>: callq 0x1070 <printf@plt>
12 #else
13 // addr &j is higher than &i
14 printf("%d, %d\n%p, %p\n", i, j, &i, &j); // prints 3, 4
15 #endif
16 return 0;
0x00000000000011c1 <+88>: mov $0x0,%eax
17 }
0x00000000000011c6 <+93>: mov -0x8(%rbp),%rcx
0x00000000000011ca <+97>: xor %fs:0x28,%rcx
0x00000000000011d3 <+106>: je 0x11da <main+113>
0x00000000000011d5 <+108>: callq 0x1060 <__stack_chk_fail@plt>
0x00000000000011da <+113>: leaveq
0x00000000000011db <+114>: retq
End of assembler dump.
Dump of assembler code for function main:
a.c:
4 {
0x0000000000001169 <+0>: endbr64
0x000000000000116d <+4>: push %rbp
0x000000000000116e <+5>: mov %rsp,%rbp
0x0000000000001171 <+8>: sub $0x20,%rsp
0x0000000000001175 <+12>: mov %fs:0x28,%rax
0x000000000000117e <+21>: mov %rax,-0x8(%rbp)
0x0000000000001182 <+25>: xor %eax,%eax
5 int i = 3;
0x0000000000001184 <+27>: movl $0x3,-0x18(%rbp)
6 int j = 4;
0x000000000000118b <+34>: movl $0x4,-0x14(%rbp)
7 int *p = &j;
0x0000000000001192 <+41>: lea -0x14(%rbp),%rax
0x0000000000001196 <+45>: mov %rax,-0x10(%rbp)
8 *(p+1) = 7;
0x000000000000119a <+49>: mov -0x10(%rbp),%rax
0x000000000000119e <+53>: add $0x4,%rax
0x00000000000011a2 <+57>: movl $0x7,(%rax)
9 #if 0
10 // addr &i is higher than &j
11 printf("%d, %d\n", i, j); // prints 7, 4
12 #else
13 // addr &j is higher than &i
14 printf("%d, %d\n%p, %p\n", i, j, &i, &j); // prints 3, 4
0x00000000000011a8 <+63>: mov -0x14(%rbp),%edx
0x00000000000011ab <+66>: mov -0x18(%rbp),%eax
0x00000000000011ae <+69>: lea -0x14(%rbp),%rsi
0x00000000000011b2 <+73>: lea -0x18(%rbp),%rcx
0x00000000000011b6 <+77>: mov %rsi,%r8
0x00000000000011b9 <+80>: mov %eax,%esi
0x00000000000011bb <+82>: lea 0xe42(%rip),%rdi # 0x2004
0x00000000000011c2 <+89>: mov $0x0,%eax
0x00000000000011c7 <+94>: callq 0x1070 <printf@plt>
15 #endif
16 return 0;
0x00000000000011cc <+99>: mov $0x0,%eax
17 }
0x00000000000011d1 <+104>: mov -0x8(%rbp),%rdi
0x00000000000011d5 <+108>: xor %fs:0x28,%rdi
0x00000000000011de <+117>: je 0x11e5 <main+124>
0x00000000000011e0 <+119>: callq 0x1060 <__stack_chk_fail@plt>
0x00000000000011e5 <+124>: leaveq
0x00000000000011e6 <+125>: retq
End of assembler dump.
