x86 NASM Assembly - Hello World Explained

x86 NASM Assembly - Hello World Explained

In this post, we'll take you on a step-by-step journey through a classic "Hello, World!" assembly program. We'll break down each line of code.

Introduction

  • First, let's clarify a few essential concepts. In assembly, comments are denoted by a semicolon ;, allowing us to add explanations to our code without affecting its functionality. To display text on the screen, we'll utilize the system call sys_write.

    • using system call sys_write
mov    edx,len     ; message length
mov    ecx,msg     ; message to write
mov    ebx,1       ; file descriptor 1 (stdout)
mov    eax,4       ; system call number 4 (sys_write)
int    0x80        ; call kernel

for more info: assembly system calls

The Breakdown

section    .data
    msg db "Hello, world!", 0xa  ;string to be printed
    len equ $ - msg              ;length of the string

section    .text
   global _start     ;must be declared for linker (ld)

_start:                ;tells linker entry point
   mov    edx,len     ;message length
   mov    ecx,msg     ;message to write
   mov    ebx,1       ;file descriptor 1 (stdout)
   mov    eax,4       ;system call number (sys_write)
   int    0x80        ;call kernel

   mov    eax,1       ;system call number 1 (sys_exit)
   int    0x80        ;call kernel
  • section .data − this section is where static variables are defined

    • msg db "Hello World!", 0xA − declaring a variable of bytes containing "hello world!" and the line feed character '0xA' or 10 in decimal and storing its address in msg

    • len equ $ - msg − getting the length of msg by subtracting its address from the value of the current address

  • section .text − this section is where the program instructions are located

    • global _start − to declare the entry point of our program
  • _start − tell the linker this is our entry point

    • mov edx, len − store msg length in the register edx

    • mov ecx, msg − storing the hello world string in the register ecx

    • mov ebx, 1 − setting file descriptor to 1 (stdout)

    • mov eax, 4 − setting system call 4 (sys_write)

    • int 0x80 − calling the kernel to take action

    • mov eax,1 − setting system call 1 (sys_exit)

    • int 0x80 − calling the kernel again

And that's what a hello world program looks like in assembly.

Compiling

to compile this program, two steps are needed assembling and linking:

First, make sure you have the assembler nasm and the linker ld installed in your system.

  • to install nasm on Ubuntu type sudo apt install nasm , on other platforms check this link assembly environment setup

  • ld comes preinstalled on most operating systems

  • assembling:

    • to assemble the program considering it's in a file called "hello.asm" we use the command nasm -f elf hello.asm

    • if no errors occured, an object file hello.o will be created in the same directory

  • Linking:

    • to link our object file into an executable we use this command ld -m elf_i368 -o hello hello.o

Alternatively, you can run it online Here.

Thanks for reading!