RosettaCodeData/Task/Binary-digits/X86-64-Assembly/binary-digits-2.x86-64
2024-10-16 18:07:41 -07:00

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