x86 NASM Assembly - Hello World Explained

0ussamaBernou0ussamaBernou
3 min read

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!

10
Subscribe to my newsletter

Read articles from 0ussamaBernou directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

0ussamaBernou
0ussamaBernou