#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.