HAKATEMIA
23NASM käytännössä

Makrot ja `%include`

Keskitaso25MIN

Makrot ja %include

Pienikin assembly-projekti saa nopeasti ympärilleen toistoa: samat syscall-kutsut, samat tulosteet, sama exit-sekvenssi. NASM:n esikäsittelijä (preprocessor) auttaa.

%define: nimetyt vakiot

C:n #define:n vastine:

NASM
1%define SYS_WRITE 1
2%define SYS_EXIT  60
3%define STDOUT    1
4
5mov     rax, SYS_WRITE

Esikäsittelijä korvaa nimet niiden arvoilla ennen kuin assembler näkee koodia.

%macro: koodikatkelmat

Makro ottaa argumentit ja laajenee koodiriveiksi:

NASM
1%macro print_str 2          ; nimi, argumenttien lkm
2    mov     rax, SYS_WRITE
3    mov     rdi, STDOUT
4    lea     rsi, [%1]       ; %1 = ensimmäinen argumentti
5    mov     rdx, %2         ; %2 = toinen argumentti
6    syscall
7%endmacro

Käyttö:

X86
1print_str msg, msglen

Esikäsittelijä laajentaa kutsupisteet kokonaan auki ennen assembleria: yksi makrokutsu = neljä konekäskyä syöttöpuolella.

%include: jaettu pohja

Iso projekti jakautuu helposti useaan tiedostoon. %include "header.inc" lukee toisen tiedoston sisällön rivi riviltä paikalleen:

NASM
1%include "macros.inc"
2
3section .data
4msg: db "Moi!", 10
5msglen equ $ - msg
6
7section .text
8global _start
9_start:
10    print_str msg, msglen
11    sys_exit 0

Tämä on ainoa "modulointi", joka NASM:lla on: ei moduuleja, ei nimiavaruuksia, ei tuontia.

TERMINALASCIINEMA

Ehdolliset makrot: %if, %ifdef

Voit haarauttaa esikäsittelijätasolla:

NASM
1%ifdef DEBUG
2    ; ylimääräinen tulostus
3%endif
4
5%if SYSCALL_MODE == 64
6    mov     rax, 60
7    syscall
8%elif SYSCALL_MODE == 32
9    mov     eax, 1
10    int     0x80
11%endif

Käytännöllistä kun tuet sekä 32- että 64-bittistä koodia samasta lähteestä.

1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.