Makrot ja `%include`
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:
1%define SYS_WRITE 1
2%define SYS_EXIT 60
3%define STDOUT 1
4
5mov rax, SYS_WRITEEsikäsittelijä korvaa nimet niiden arvoilla ennen kuin assembler näkee koodia.
%macro: koodikatkelmat
Makro ottaa argumentit ja laajenee koodiriveiksi:
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%endmacroKäyttö:
1print_str msg, msglenEsikä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:
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 0Tämä on ainoa "modulointi", joka NASM:lla on: ei moduuleja, ei nimiavaruuksia, ei tuontia.
Ehdolliset makrot: %if, %ifdef
Voit haarauttaa esikäsittelijätasolla:
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%endifKäytännöllistä kun tuet sekä 32- että 64-bittistä koodia samasta lähteestä.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.