An Interesting C Program

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

Leave a comment

Your email address will not be published.

The maximum upload file size: 50 MB. You can upload: image, audio, video, document, spreadsheet, interactive, text, archive, code, other. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here