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
This was very useful. I've seen another example where the code loops through the message byte by byte, without using syscall but it might have been for 16bit code.