Date created: 04/10/16 20:05:07. Last modified: 01/13/17 11:56:45

Compile C to Readable ASM

Compile the source with debugging enabled, compile but don't link:

[email protected]:~/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;
}


[email protected]:~/c$ gcc -g -c if.c 
[email protected]:~/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):

[email protected]:~/c$ gcc -O2 -S if.c 
[email protected]:~/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
[email protected]:~/c$ gcc -m32 -S -masm=intel if.c
[email protected]:~/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: TimeMachine Automation
Next page: Box 256 - Hello World