nasm Notes

Posted by Paweł Sacawa on Tuesday, July 11, 2023
Last Modified on Wednesday, December 27, 2023

NASM

Hello World

section .data
  mygreeting db "hello world!"
  len equ $ - mygreeting

section .text
global _start
_start:

  mov rax, 1 ; write
  mov rdi, 1 ; stdout
  mov rsi, mygreeting
  mov rdx, len
  syscall

  mov rax, 60 ; exit amd64
  mov rdi, 0
  syscall

Makra

Wyrównanie (ang. alignment) wskaźnika stosu:

; align to resolution (%1)
%macro ALIGN_STACK 1 
  ; align
  mov rdi, %1
  sub rdi, 1
  not rdi
  and rsp, rdi
%endmacro

Wskazówki

Ucieczki w Stylu C

Aby użyć ‘\n’ jako koniec linii, trzeba otoczyć go backtikami, czyli

section .data
  fmt db `hello %s\n\0`

Adresowanie względem Licznika programu

mov rax, [rel 0x1000]

Stos

Zmienne Lokalne

Najpierw trzeba zdefiniować macro lokalne dla kontekstu %$localsize określający rozmiar ramy stosu:

some_func:
  %push start_ctx
  %assign %$localsize 0x40
  %local i:DWORD

  enter %$localsize, 0
  // push $rbp; $rsp := $rbp - %$localsize;
  mov DWORD [i], 0xdeadbeef
  leave
  %pop

Wskaźniki

Zamiast e.g.

add rax,QWORD PTR fs:0x0

w składni nasm mamy

add rax,QWORD [fs:0x0]