# Assembler Debuggers and Tool Arsenal

### 1. Assembler

An assembler is a program that translates the Assembly language to the machine code. There are several different assemblers that depend on the target system's **ISA**:

* Microsoft Macro Assembler ([MASM](https://msdn.microsoft.com/en-us/library/afzk3475.aspx)), x86 assembler that uses Intel syntax for MS-DOS and Microsoft Windows
* GNU Assembler ([GAS](https://www.gnu.org/software/binutils/)), used by GNU Project, default back-end of GCC
* Netwide Assembler ([NASM](http://www.nasm.us/)), x86 architecture used to write 16-bit, 32-bit(IA-32), and 64-bit(x86-64) programs, one of the most popular assemblers for Linux
* Flat Assembler ([FASM](http://flatassembler.net/)), x86, supports Intel-style assembly language on the IA-32 and x86-64

We will use **NASM** in this note

When a source code file is assembled, the resulting file is called an **object file**. It is a binary representation of the program.

While the assembly instructions and the machine code have a one-to-one correspondence, and the translation process may be simple, the assembler does some further operations such as assigning memory location to variables and instructions and resolving symbolic names.

Once the assembler has created the object file, a **linker** is needed in order to create the actual executable file. What a linker does is take one or more object files and combine them to create the executable file.

An example of these object files are the _kernel32.dll_ and _user32.dll_ which are required to create a windows executables that accesses certain libraries.

The process from the assembly code to the executable file can be represented here:

```
             ASM File
                 |
                 V
           -------------
           | Assembler |
           -------------
      ___________|____________
      |          |            |
      V          V            V
Object File Object File Static Library
      |          |            |
      _________________________
                 |
                 V
             ----------
             | Linker |
             ----------
                 |
                 V
             Executables


```
