Skip to content

Instantly share code, notes, and snippets.

@rredpoppy
Forked from yellowbyte/compiling_asm.md
Created October 9, 2023 03:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rredpoppy/729f4a3de5b35019cf3e9739072ec056 to your computer and use it in GitHub Desktop.
Save rredpoppy/729f4a3de5b35019cf3e9739072ec056 to your computer and use it in GitHub Desktop.
how to assemble assembly with NASM assembler to 32-bit or 64-bit ELF binary with or without libc

32-bit ELF binary

how to assemble and link:

nasm -f elf32 -o <filename>.o <filename>.asm
ld -m elf_i386 -o <filename> <filename>.o

template code (hello world):

section .text
global _start

%define system_call int 0x80

_start:
    mov ebx, 0x1
    mov ecx, hello
    mov edx, helloLen
    mov eax, 0x4
    system_call

    xor ebx, ebx
    mov eax, 0x1
    system_call

section .data
    hello db "Hello World", 0xa
    helloLen equ $-hello

64-bit ELF binary

how to assemble and link:

nasm -f elf64 -o <filename>.o <filename>.asm
ld -o <filename> <filename>.o

template code (hello world):

section .text
global _start

_start:
    mov rdi, 0x1
    mov rsi, hello
    mov rdx, helloLen
    mov rax, 0x1
    syscall

    xor rdi, rdi
    mov rax, 0x3c
    syscall

section .data
    hello db "Hello World", 0xa
    helloLen equ $-hello

32-bit ELF binary with libc

how to assemble and link:

nasm -f elf32 -o <filename>.o <filename>.asm
ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o <filename> -lc <filename>.o

template code (hello world):

extern puts
extern exit

section .text
global _start

%macro call_func 1
    call %1
    add esp, 0x4
%endmacro

_start:
    push hello
    call_func puts

    mov eax, 0xa
    call exit

section .data
    hello db "Hello World"

64-bit ELF binary with libc

how to assemble and link:

nasm -f elf64 -o <filename>.o <filename>.asm
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o <filename> -lc <filename>.o

template code (hello world):

extern puts
extern exit

section .text
global _start

%macro call_func 1
    call %1
%endmacro

_start:
    mov rdi, hello
    call_func puts

    mov rax, 0xa 
    call exit

section .data
    hello db "Hello World"

NOTE :

  • Assembler Directives: instructions for the assembler (e.g. NASM) and not a part of the ISA
    • extern: declare a symbol which is defined in another module that will later be linked with current one
    • section: identifies the section the code you write will go into. Examples of common ones are .text, .data, and .bss
    • global: defines symbols such that other modules that EXTERN those symbols can correctly reference them after linking
    • macro: a name that represents a snippet of code
    • define: a single-line macro
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment