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