global _start bsize equ 72 outbase equ 2 ; 2 to 16 section .text _start: pop rcx dec rcx or rcx, rcx jz .exit0 pop rdx xor rdx, rdx .cmdloop: pop rdi call atoq mov qword [slot + rdx * 8], rax inc rdx cmp rdx, rcx jne .cmdloop xor rdx, rdx .printloop: mov rdi, qword [slot + rdx * 8] call printq inc rdx cmp rdx, rcx jne .printloop .exit0: mov rax, 60 mov rdi, 0 syscall atoq: push r8 push r9 push rdi push rsi push rdx push rcx xor rcx, rcx xor rax, rax xor r8, r8 mov r9, 1 cmp byte[rdi], 0 jz .exit cmp byte[rdi], '-' jne .stbegin mov r9, -1 inc rdi .stbegin: cmp byte[rdi], '0' jl .return cmp byte[rdi], '9' jg .return .stloop: cmp byte[rdi + r8], '0' jl .calc0 cmp byte[rdi + r8], '9' jg .calc0 mov sil, byte[rdi + r8] sub rsi, '0' push rsi inc r8 jmp .stloop .calc0: xor rcx, rcx mov rdi, 10 mov rsi, 1 .calc1: pop rax mul rsi add rcx, rax dec r8 jz .return mov rax, rsi mul rdi mov rsi, rax jmp .calc1 .return: xor rdx, rdx mov rax, rcx imul r9 .exit: pop rcx pop rdx pop rsi pop rdi pop r9 pop r8 ret printq: push r9 push rdi push rsi push rdx push rcx push rax mov rax, rdi mov r9, bsize dec r9 mov rsi, outbase sub rsp, bsize sub rax, 0 jns .stloop neg rax .stloop: xor rdx, rdx div rsi mov dl, byte [charset + rdx] mov byte[rsp + r9], dl sub rax, 0 jz .negtest dec r9 jmp .stloop .negtest: sub rdi, 0 jns .printit dec r9 mov byte[rsp + r9], '-' .printit: mov rdx, bsize sub rdx, r9 mov rsi, rsp add rsi, r9 mov rdi, 1 mov rax, 1 syscall mov rsi, 0x0a push rsi mov rsi, rsp mov rdx, 1 mov rax, 1 mov rdi, 1 syscall pop rsi .restores: add rsp, bsize pop rax pop rcx pop rdx pop rsi pop rdi pop r9 .return: ret section .data charset: db "0123456789abcdef" section .bss slot: resq 16