summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--constants.inc11
-rw-r--r--pasmgen-linux.asm75
-rw-r--r--pasmgen.asm134
-rw-r--r--pasmgen.inc55
4 files changed, 141 insertions, 134 deletions
diff --git a/constants.inc b/constants.inc
new file mode 100644
index 0000000..52885f8
--- /dev/null
+++ b/constants.inc
@@ -0,0 +1,11 @@
+usage db "usage: passmgen [<triplet#> <symbol#> <number#>]", 10
+usage_len = $ - usage
+
+numbers db "0123456789"
+numbers_len = $ - numbers
+vowels db "aeiou"
+vowels_len = $ - vowels
+consonants db "bcdfghjklmnpqrstvwxyz"
+consonants_len = $ - consonants
+symbols db "!@#$%&()-=_+[]{}\\|;<>/?."
+symbols_len = $ - symbols
diff --git a/pasmgen-linux.asm b/pasmgen-linux.asm
new file mode 100644
index 0000000..56113e6
--- /dev/null
+++ b/pasmgen-linux.asm
@@ -0,0 +1,75 @@
+format ELF64 executable
+
+segment readable executable
+
+main:
+ ;; No arg preload case
+ cmp [rsp], word 1
+ jne argparse
+
+ mov r8, qword 3
+ mov r9, qword 2
+ mov r10, qword 3
+
+ jmp generate
+
+argparse:
+ ;; Check args (need 3)
+ cmp [rsp], word 3
+ jle fail
+
+ ;; load arg1
+ mov r8, [rsp+16]
+ mov r8, [r8]
+ and r8, 0xFF
+ sub r8, 48
+
+ ;; load arg2
+ mov r9, [rsp+24]
+ mov r9, [r9]
+ and r9, 0xFF
+ sub r9, 48
+
+ ;; load arg3
+ mov r10, [rsp+32]
+ mov r10, [r10]
+ and r10, 0xFF
+ sub r10, 48
+
+ jmp generate
+
+ok:
+ ;; 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
+
+fail:
+ ;; Write
+ mov rdi, 1 ;; stdout
+ mov rsi, usage
+ mov rdx, usage_len
+ mov rax, 0x01
+ syscall
+
+ ;; Exit 1
+ mov rdi, 1
+ mov rax, 0x3c
+ syscall
+
+
+include 'pasmgen.inc'
+
+
+segment readable writeable
+
+include 'constants.inc'
+
+out_buf rb 64
diff --git a/pasmgen.asm b/pasmgen.asm
deleted file mode 100644
index ffcce2c..0000000
--- a/pasmgen.asm
+++ /dev/null
@@ -1,134 +0,0 @@
-format ELF64 executable
-
-macro genclass class, class_len
-{
- ;; 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]
- mov [rcx], rdx
- inc rcx
-
- inc rsi
-}
-
-segment readable executable
-
-entry main
-main:
- ;; No arg preload case
- cmp [rsp], word 1
- jne argparse
-
- mov r8, qword 3
- mov r9, qword 2
- mov r10, qword 3
-
- jmp generate
-
-argparse:
- ;; Check args (need 3)
- cmp [rsp], word 3
- jle fail
-
- ;; load arg1
- mov r8, [rsp+16]
- mov r8, [r8]
- and r8, 0xFF
- sub r8, 48
-
- ;; load arg2
- mov r9, [rsp+24]
- mov r9, [r9]
- and r9, 0xFF
- sub r9, 48
-
- ;; load arg3
- mov r10, [rsp+32]
- mov r10, [r10]
- and r10, 0xFF
- sub r10, 48
-
-generate:
- ;; Store which output byte we're up to in rcx
- mov rcx, out_buf
- ;; Store chars generated in rsi
- xor rsi, rsi
-
-tripleter:
- genclass consonants, consonants_len
- genclass vowels, vowels_len
- genclass consonants, consonants_len
- dec r8
- test r8, r8
- jnz tripleter
-symboler:
- genclass symbols, symbols_len
- dec r9
- test r9, r9
- jnz symboler
-numberer:
- genclass numbers, numbers_len
- dec r10
- test r10, r10
- jnz numberer
-
- ;; Append new line to string
- mov [rcx], word 10
- inc rsi
-
- ;; Special case to caps the first character
- xor rax, rax
- mov al, byte [out_buf]
- sub al, 32
- mov rbx, out_buf
- mov [rbx], al
-
- ;; 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
-
-fail:
- ;; Write
- mov rdi, 1 ;; stdout
- mov rsi, usage
- mov rdx, usage_len
- mov rax, 0x01
- syscall
-
- ;; Exit 1
- mov rdi, 1
- mov rax, 0x3c
- syscall
-
-
-segment readable writeable
-
-usage db "usage: passmgen [<triplet#> <symbol#> <number#>]", 10
-usage_len = $ - usage
-
-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 64
diff --git a/pasmgen.inc b/pasmgen.inc
new file mode 100644
index 0000000..95fadb7
--- /dev/null
+++ b/pasmgen.inc
@@ -0,0 +1,55 @@
+macro genclass class, class_len
+{
+ ;; 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]
+ mov [rcx], rdx
+ inc rcx
+
+ inc rsi
+}
+
+generate:
+ ;; Store which output byte we're up to in rcx
+ mov rcx, out_buf
+ ;; Store chars generated in rsi
+ xor rsi, rsi
+
+tripleter:
+ genclass consonants, consonants_len
+ genclass vowels, vowels_len
+ genclass consonants, consonants_len
+ dec r8
+ test r8, r8
+ jnz tripleter
+symboler:
+ genclass symbols, symbols_len
+ dec r9
+ test r9, r9
+ jnz symboler
+numberer:
+ genclass numbers, numbers_len
+ dec r10
+ test r10, r10
+ jnz numberer
+
+ ;; Append new line to string
+ mov [rcx], word 10
+ inc rsi
+
+ ;; Special case to caps the first character
+ xor rax, rax
+ mov al, byte [out_buf]
+ sub al, 32
+ mov rbx, out_buf
+ mov [rbx], al
+
+ jmp ok