summaryrefslogtreecommitdiffstats
path: root/b32e.asm
diff options
context:
space:
mode:
authorNao Pross <naopross@thearcway.org>2018-11-27 19:54:02 +0100
committerNao Pross <naopross@thearcway.org>2018-11-27 19:54:02 +0100
commit0583f594c484ccd9ea3986a21dd670cabb9edc39 (patch)
tree1e4be5139d9ee4ce064e1b4ffb3252583146f462 /b32e.asm
downloadbase32asm-0583f594c484ccd9ea3986a21dd670cabb9edc39.tar.gz
base32asm-0583f594c484ccd9ea3986a21dd670cabb9edc39.zip
Initial implementation of encoder
Diffstat (limited to 'b32e.asm')
-rw-r--r--b32e.asm67
1 files changed, 67 insertions, 0 deletions
diff --git a/b32e.asm b/b32e.asm
new file mode 100644
index 0000000..b74d7d7
--- /dev/null
+++ b/b32e.asm
@@ -0,0 +1,67 @@
+section .data
+
+rfc4648 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
+
+section .bss
+
+input_buffer resb 5
+output_buffer resb 8
+
+section .text
+global _start
+
+; read_input
+; reads 5 bytes (40 bits) of input
+read_input:
+ ; linux x64 read(stdin, input_buffer, 5)
+ mov rax, 0
+ mov rdi, 0
+ mov rsi, input_buffer
+ mov rdx, 5
+ syscall
+
+; write_output
+; writes the output buffer to stdout
+write_output:
+ ; linux x64 write(stdout, output_buffer, 8)
+ mov rax, 1
+ mov rdi, 1
+ mov rsi, output_buffer
+ mov rdx, 5
+ syscall
+
+; b32e
+; encodes 40 bits (5 bytes) to 8 RFC4648 base32 characters
+; inputs: bl=5 bits
+; uses: rxb, rdx, r11
+b32e:
+ ; set up outputs counter
+ xor r11, r11
+.loop:
+ ; get 5 bits from the input
+ xor rbx, rbx
+ mov bl, byte [input_buffer]
+ and bl, 0x1f
+
+ ; rshift the input buffer
+
+ ; convert to base32
+ add rbx, rfc4648
+ mov dl, byte [rbx]
+ mov byte [output_buffer + r11], dl
+
+ ; increase counter
+ inc r11
+ cmp r11, 8
+ js .loop
+
+
+_start:
+ nop
+ call read_input
+ call b32e
+
+ ; linux x64 exit(0)
+ mov rax, 60
+ mov rdi, 0
+ syscall