The assembler then converts the assembly code to object code. The object file contains machine code. Also the object file contains re-location information for the undefined symbols. A typical C program contains reference to symbols such as printf, scanf which are defined in some other libraries. The address offset of these symbols in memory cannot be determined at this stage, therefore incomplete references to these symbols are made in the object code. The references to these symbols are replaced with their actual addresses by the linker in the next phase. The object code for for an assembly program can be obtained by using as in the following way:

$ as -o area.s

This would generate an object file area.o. The object files have .o extension.

The object code can be disassembled back into assembly code and what changes the assembler has done can be seen using the objdump command as follows:

$ objdump -d area.o




Disassembly of section .text:

00000000 <main>:

0: 55 push %ebp

1: 89 e5 mov %esp,%ebp

3: 83 ec 08 sub $0x8,%esp

6: c7 45 fc 03 00 00 00 movl $0x3,0xfffffffc(%ebp)

d: 83 ec 04 sub $0x4,%esp

10: 8b 45 fc mov 0xfffffffc(%ebp),%eax

13: 0f af 45 fc imul 0xfffffffc(%ebp),%eax

17: 50 push %eax

18: ff 75 fc pushl 0xfffffffc(%ebp)

1b: 68 00 00 00 00 push $0x0

20: e8 fc ff ff ff call 21 <main+0x21>

25: 83 c4 10 add $0x10,%esp

28: b8 00 00 00 00 mov $0x0,%eax

2d: c9 leave

2e: c3 ret

2f: 90 nop

Here the call to the function printf (call printf in the assembly file) has been replaced with a relative address (call 21 < main+0x21 >) in the object file. This relative address would then be replaced by the actual address by the linker in the later phase.