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
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
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"
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
Glad to hear :)