summaryrefslogtreecommitdiffstats
path: root/b32e.asm
blob: 04ce6716a752d15a47b18497b6b0de6a1369d4a9 (plain)
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
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
	ret

; 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
	ret

; 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 
	ret


_start:
	nop
	call read_input
	call b32e
	call write_output
.exit:
	; linux x64 exit(0)
	mov rax, 60
	mov rdi, 0
	syscall