1- macro clr reg { xor reg , reg }
1+ macro clr reg { xor reg , reg } ; clears the specified register using xor
22
33macro exit value {
4- mov rax , 60
5- mov rdi , value
6- syscall
4+ mov rax , 60 ; sets syscall number for exit
5+ mov rdi , value ; sets exit code
6+ syscall ; performs the syscall
77}
88
99macro mkdir dir_name , permissions {
10- push rdi
11- push rsi
10+ push rdi ; saves rdi register
11+ push rsi ; saves rsi register
1212
13- mov rax , 83
14- mov rdi , dir_name
15- mov rsi , permissions
16- syscall
13+ mov rax , 83 ; sets syscall number for mkdir
14+ mov rdi , dir_name ; sets path to directory
15+ mov rsi , permissions ; sets permissions
16+ syscall ; performs the syscall
1717
18- pop rsi
19- pop rdi
18+ pop rsi ; restores rsi register
19+ pop rdi ; restores rdi register
2020}
2121
2222macro time {
23- push rdi
23+ push rdi ; saves rdi register
2424
25- mov rax , 201
26- xor rdi , rdi
27- syscall
25+ mov rax , 201 ; sets syscall number for time
26+ xor rdi , rdi ; sets argument to NULL (store time in rax)
27+ syscall ; performs the syscall
2828
29- pop rdi
29+ pop rdi ; restores rdi register
3030
3131}
3232
3333macro printnum value {
34- push rdi
35- push rcx
36- push rbx
37- push rdx
38- push rsi
39- push r8
40-
41- local .convert
42-
43- mov rax , value
44- mov rdi , buffer
45- add rdi , 31
46- mov byte [ rdi ], 0
47-
48- mov rcx , 10
49- mov rbx , rax
50-
51- .convert:
52- dec rdi
53- xor rdx , rdx
54- div rcx
55- add dl , '0'
56- mov [ rdi ], dl
57- test rax , rax
58- jnz .convert
34+ push rdi ; saves rdi register
35+ push rcx ; saves rcx register
36+ push rbx ; saves rbx register
37+ push rdx ; saves rdx register
38+ push rsi ; saves rsi register
39+ push r8 ; saves r8 register
40+
41+ local .convert ; declares local label .convert
42+
43+ mov rax , value ; moves value to rax
44+ mov rdi , buffer ; sets rdi to point to buffer start
45+ add rdi , 31 ; moves rdi to end of buffer
46+ mov byte [ rdi ], 0 ; writes null terminator at buffer end
47+
48+ mov rcx , 10 ; sets divisor to 10 (decimal base)
49+ mov rbx , rax ; copies value to rbx for division
50+
51+ .convert: ; .convert label start
52+ dec rdi ; moves pointer one byte left
53+ xor rdx , rdx ; clears rdx (high part of dividend)
54+ div rcx ; divides rax by rcx, quotient in rax, remainder in rdx
55+ add dl , '0' ; converts remainder to ASCII digit
56+ mov [ rdi ], dl ; stores digit at current rdi
57+ test rax , rax ; tests if quotient is zero
58+ jnz .convert ; loops if quotient not zero
5959
6060 mov rsi , rdi
61- mov rax , 1
62- mov rdi , 1
63- mov rdx , buffer
64- add rdx , 32
65- sub rdx , rsi
66- syscall
67-
68- xor r8 , r8
69- mov r8 , rax
70-
71- mov rax , 1
72- mov rdi , 1
73- mov rsi , newline
74- mov rdx , 1
75- syscall
76-
77- add rax , r8
78-
79- pop r8
80- pop rsi
81- pop rdx
82- pop rbx
83- pop rcx
84- pop rdi
61+ mov rax , 1 ; sets syscall number for write
62+ mov rdi , 1 ; sets file descriptor to stdout (1)
63+ mov rdx , buffer ; buffer start address
64+ add rdx , 32 ; buffer end address
65+ sub rdx , rsi ; calculates length of number string
66+ syscall ; performs syscall
67+
68+ xor r8 , r8 ; clears r8
69+ mov r8 , rax ; saves number of bytes written
70+
71+ mov rax , 1 ; sets syscall number for write
72+ mov rdi , 1 ; sets file descriptor to stdout (1)
73+ mov rsi , newline ; pointer to newline char
74+ mov rdx , 1 ; length 1 byte
75+ syscall ; performs the syscall
76+
77+ add rax , r8 ; adds bytes written (number + newline)
78+
79+ pop r8 ; restores r8 register
80+ pop rsi ; restores rsi register
81+ pop rdx ; restores rdx register
82+ pop rbx ; restores rbx register
83+ pop rcx ; restores rcx register
84+ pop rdi ; restores rdi register
8585}
8686
8787macro printtim times , str , str_len {
88- local . loop
88+ push r8 ; saves r8 register
89+ push rbx ; saves rbx register
90+ push rdi ; saves rdi register
91+ push rsi ; saves rsi register
92+ push rdx ; saves rdx register
8993
90- push r8
91- push rbx
92- push rdi
93- push rsi
94- push rdx
94+ local . loop ; declares local label .loop
9595
96- xor r8 , r8
97- mov rbx , times
96+ xor r8 , r8 ; clears r8 (counter)
97+ mov rbx , times ; moves times to rbx (loop counter)
9898
99- . loop :
100- mov rax , 1
101- mov rdi , 1
102- mov rsi , str
103- mov rdx , str_len
104- syscall
99+ . loop : ; .loop label start
100+ mov rax , 1 ; sets syscall number for write
101+ mov rdi , 1 ; sets file descriptor to stdout (1)
102+ mov rsi , str ; sets pointer to string to write
103+ mov rdx , str_len ; sets length of string
104+ syscall ; performs the syscall
105105
106- add r8 , rax
106+ add r8 , rax ; adds number of bytes written to r8
107107
108- dec rbx
109- jnz . loop
108+ dec rbx ; decrements rbx
109+ jnz . loop ; jumps to .loop if rbx not zero
110110
111- mov rax , r8
111+ mov rax , r8 ; moves total bytes written from r8 to rax
112112
113- pop rdx
114- pop rsi
115- pop rdi
116- pop rbx
117- pop r8
113+ pop rdx ; restores rdx register
114+ pop rsi ; restores rsi register
115+ pop rdi ; restores rdi register
116+ pop rbx ; restores rbx register
117+ pop r8 ; restores r8 register
118118}
119119
120120macro print str , str_len {
121- push rdi
122- push rsi
123- push rdx
124-
125- mov rax , 1
126- mov rdi , 1
127- mov rsi , str
128- mov rdx , str_len
129- syscall
130-
131- pop rdx
132- pop rsi
133- pop rdi
121+ push rdi ; saves rdi register
122+ push rsi ; saves rsi register
123+ push rdx ; saves rdx register
124+
125+ mov rax , 1 ; sets syscall number for write
126+ mov rdi , 1 ; sets file descriptor to stdout (1)
127+ mov rsi , str ; sets pointer to string to write
128+ mov rdx , str_len ; sets length of string
129+ syscall ; performs the syscall
130+
131+ pop rdx ; restores rdx register
132+ pop rsi ; restores rsi register
133+ pop rdi ; restores rdi register
134134}
135135
136136macro rmdir dir_name {
137- push rdi
137+ push rdi ; saves rdi register
138138
139- mov rax , 84
140- mov rdi , dir_name
141- syscall
139+ mov rax , 84 ; sets syscall number for rmdir
140+ mov rdi , dir_name ; sets path to directory
141+ syscall ; performs the syscall
142142
143- pop rdi
143+ pop rdi ; restores rdi register
144144}
145145
146146macro run command {
147147 local .path , .arg2str , .arg3str , .argv
148148
149- mov rax , 59
150- lea rdi , [ .path ]
151- lea rsi , [ .argv ]
152- xor rdx , rdx
153- syscall
149+ mov rax , 59 ; sets syscall number for execve
150+ lea rdi , [ .path ] ; loads pointer to program path "/bin/sh"
151+ lea rsi , [ .argv ] ; loads pointer to argument vector array
152+ xor rdx , rdx ; clears rdx (envp pointer set to NULL)
153+ syscall ; performs the syscall
154154
155- .path db "/bin/sh" , 0
156- .arg2str db "-c" , 0
157- .arg3str db command , 0
158- .argv dq .path , .arg2str , .arg3str , 0
155+ .path db "/bin/sh" , 0 ; defines path string "/bin/sh" null-terminated
156+ .arg2str db "-c" , 0 ; defines second argument "-c" null-terminated
157+ .arg3str db command , 0 ; defines third argument as the command string null-terminated
158+ .argv dq .path , .arg2str , .arg3str , 0 ; defines argv array with pointers to path, arg2str, arg3str, and NULL terminator
159159}
160160
161- macro push [ arg ] { push arg }
161+ macro push [ arg ] { push arg } ; saves multiple registers onto the stack
162+
163+ macro pop [ arg ] { pop arg } ; restores multiple registers from the stack
162164
163- macro pop [ arg ] { pop arg }
164165
165166newline db 10
166167buffer rb 32
0 commit comments