summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--b32e.asm67
-rw-r--r--makefile5
3 files changed, 76 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7fc285c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+b32e
+b32d
+
+*.o
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
diff --git a/makefile b/makefile
new file mode 100644
index 0000000..a5df0c9
--- /dev/null
+++ b/makefile
@@ -0,0 +1,5 @@
+b32e: b32e.o
+ ld -o $@ $<
+
+b32e.o: b32e.asm
+ nasm -f elf64 -O0 -w+all -o $@ $<