150 lines
2.3 KiB
Text
150 lines
2.3 KiB
Text
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
|