Date created: Sunday, April 10, 2016 8:05:07 PM. Last modified: Monday, June 3, 2019 8:05:25 AM
Compile C to Readable ASM
Compile the source with debugging enabled, compile but don't link:
bensley@ubuntu:~/c$ cat if.c #include <stdio.h> int main () { const unsigned int VAL1 = 1; const unsigned long VAL2 = 100000; unsigned int value1 = 1; unsigned long value2 = 100000; if ( (value1 == VAL1) && (value2 == VAL2) ) { printf("match\n"); } return 0; } bensley@ubuntu:~/c$ gcc -g -c if.c bensley@ubuntu:~/c$ objdump -d -M intel -S if.o if.o: file format elf32-i386 Disassembly of section .text: 00000000 : #include <stdio.h> int main () { 0: 55 push ebp 1: 89 e5 mov ebp,esp 3: 83 e4 f0 and esp,0xfffffff0 6: 83 ec 20 sub esp,0x20 const unsigned int VAL1 = 1; 9: c7 44 24 10 01 00 00 mov DWORD PTR [esp+0x10],0x1 10: 00 const unsigned long VAL2 = 100000; 11: c7 44 24 14 a0 86 01 mov DWORD PTR [esp+0x14],0x186a0 18: 00 unsigned int value1 = 1; 19: c7 44 24 18 01 00 00 mov DWORD PTR [esp+0x18],0x1 20: 00 unsigned long value2 = 100000; 21: c7 44 24 1c a0 86 01 mov DWORD PTR [esp+0x1c],0x186a0 28: 00 if ( (value1 == VAL1) && (value2 == VAL2) ) { 29: 8b 44 24 18 mov eax,DWORD PTR [esp+0x18] 2d: 3b 44 24 10 cmp eax,DWORD PTR [esp+0x10] 31: 75 16 jne 49 <main+0x49> 33: 8b 44 24 1c mov eax,DWORD PTR [esp+0x1c] 37: 3b 44 24 14 cmp eax,DWORD PTR [esp+0x14] 3b: 75 0c jne 49 <main+0x49> printf("match\n"); 3d: c7 04 24 00 00 00 00 mov DWORD PTR [esp],0x0 44: e8 fc ff ff ff call 45 <main+0x45> } return 0; 49: b8 00 00 00 00 mov eax,0x0 } 4e: c9 leave 4f: c3 ret
gcc can show the machine code (without the inline c code as above using the -S switch):
bensley@ubuntu:~/c$ gcc -O2 -S if.c bensley@ubuntu:~/c$ cat if.s .file "if.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "match" .section .text.startup,"ax",@progbits .p2align 4,,15 .globl main .type main, @function main: .LFB24: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $16, %esp movl $.LC0, (%esp) call puts xorl %eax, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE24: .size main, .-main .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4" .section .note.GNU-stack,"",@progbits
bensley@ubuntu:~/c$ gcc -m32 -S -masm=intel if.c bensley@ubuntu:~/c$ cat if.s .file "if.c" .intel_syntax noprefix .section .rodata .LC0: .string "match" .text .globl main .type main, @function main: .LFB0: .cfi_startproc push ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 mov ebp, esp .cfi_def_cfa_register 5 and esp, -16 sub esp, 32 mov DWORD PTR [esp+16], 1 mov DWORD PTR [esp+20], 100000 mov DWORD PTR [esp+24], 1 mov DWORD PTR [esp+28], 100000 mov eax, DWORD PTR [esp+24] cmp eax, DWORD PTR [esp+16] jne .L2 mov eax, DWORD PTR [esp+28] cmp eax, DWORD PTR [esp+20] jne .L2 mov DWORD PTR [esp], OFFSET FLAT:.LC0 call puts .L2: mov eax, 0 leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4" .section .note.GNU-stack,"",@progbits
Previous page: Box-256 - CHECKERBOARD
Next page: Intel Opcode Examples