summaryrefslogtreecommitdiff
path: root/pasmgen.asm
blob: bbd4c37930e209a0448f8e47b8629af164131c63 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
format ELF64 executable

macro genclass class, class_len, caps
{
 	;; Generate 16 bits (smallest) of randomness from the cpu
 	rdrand ax
 
 	;; Modulo into len range to index in
	xor rdx, rdx
 	mov rbx, class_len
 	div bx

	;; Save output letter into out_buf, bump rcx
	add rdx, class
	mov rdx, [rdx]
	if caps eq 1
		sub rdx, 32
	end if
	mov [rcx], rdx
	inc rcx

	inc rsi
}

macro triplet
{
	genclass consonants, consonants_len
	genclass vowels, vowels_len
	genclass consonants, consonants_len
}

segment readable executable

entry main
main:
	;; Store which output byte we're up to in rcx
	mov rcx, out_buf
	;; Store chars generated in rsi
	xor rsi, rsi

	genclass consonants, consonants_len, 1
	genclass vowels, vowels_len
	genclass consonants, consonants_len
	triplet
	triplet
	genclass symbols, symbols_len
	genclass symbols, symbols_len
	genclass numbers, numbers_len
	genclass numbers, numbers_len
	genclass numbers, numbers_len

	mov [rcx], word 10
	inc rsi
 	
 	;; Write
 	mov rdi, 1  ;; stdout
 	mov rdx, rsi
 	mov rsi, out_buf
 	mov rax, 0x01
 	syscall
 
 	;; Exit (code 0)
 	mov rdi, 0
 	mov rax, 0x3c
 	syscall
 
segment readable writeable

numbers db "0123456789"
numbers_len = $ - numbers
vowels db "aeiou"
vowels_len = $ - vowels
consonants db "bcdfghjklmnpqrstvwxyz"
consonants_len = $ - consonants
symbols db "!@#$%&()-=_+[]{}\\|;<>/?."
symbols_len = $ - symbols

out_buf rb 32