summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--b32e.asm99
1 files changed, 56 insertions, 43 deletions
diff --git a/b32e.asm b/b32e.asm
index ada7ff0..9c136dd 100644
--- a/b32e.asm
+++ b/b32e.asm
@@ -12,63 +12,76 @@ global _start
; read_input
; reads 5 bytes (40 bits) of input
+; uses reg: rax, rdi, rsi, rdx
+; uses mem: input_buffer
read_input:
- ; linux x64 read(stdin, input_buffer, 5)
- mov rax, 0
- mov rdi, 0
- mov rsi, input_buffer
- mov rdx, 5
- syscall
- ret
+ ; 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
+; uses reg: rax, rdi, rsi, rdx
+; uses mem: output_buffer(ro)
write_output:
- ; linux x64 write(stdout, output_buffer, 8)
- mov rax, 1
- mov rdi, 1
- mov rsi, output_buffer
- mov rdx, 5
- syscall
- ret
+ ; 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
+; uses reg: rbx, rdx, r11
+; uses mem: input_buffer, output_buffer
b32e:
- ; set up outputs counter
- xor r11, r11
+ ; set up output counter
+ xor r11, r11
+
.loop:
- ; get 5 bits from the input
- xor rbx, rbx
- mov bl, byte [input_buffer]
- ; mask and shift to convert to a number 0 ~ 32
- and bl, 0xf8
- shr bl, 3
+ ; clear rbx
+ xor rbx, rbx
+
+ ; get a byte from the input
+ mov bl, byte [input_buffer]
+
+ ; mask and shift to get 5 bits which is a number in 0 ~ 31
+ and bl, 0xf8
+ shr bl, 3
+
+ ; rshift the input buffer
+ shr qword [input_buffer], 5
+
+ ; convert to base32
+ add rbx, rfc4648
+ mov dl, byte [rbx]
+ mov [output_buffer + r11], dl
- ; rshift the input buffer
- shl qword [input_buffer], 5
+ ; increase counter
+ inc r11
- ; convert to base32
- add rbx, rfc4648
- mov dl, byte [rbx]
- mov byte [output_buffer + r11], dl
+ ; check counter
+ ; when the counter reaches 8 it means that 8 characters (40 bits)
+ ; have been processed and written
+ cmp r11, 8
+ js .loop
- ; increase counter
- inc r11
- cmp r11, 8
- js .loop
- ret
+ ret
_start:
- nop
- call read_input
- call b32e
- call write_output
+ nop
+ call read_input
+ call b32e
+ call write_output
.exit:
- ; linux x64 exit(0)
- mov rax, 60
- mov rdi, 0
- syscall
+ ; linux x64 exit(0)
+ mov rax, 60
+ mov rdi, 0
+ syscall