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
|