118 lines
1.5 KiB
ArmAsm
118 lines
1.5 KiB
ArmAsm
|
[bits 64]
|
||
|
[section .text]
|
||
|
; string input in RSI
|
||
|
; value in RAX
|
||
|
; CF set if none, clear if some
|
||
|
; RSI set past checked area
|
||
|
dec_parse:
|
||
|
sub rsp, 24
|
||
|
mov [rsp+16], rbx
|
||
|
mov [rsp+8], rdx
|
||
|
mov [rsp+0], rdi
|
||
|
xor rax, rax
|
||
|
xor rdi, rdi
|
||
|
mov rbx, 10 ; base
|
||
|
lodsb
|
||
|
sub al, '0'
|
||
|
js .no_input
|
||
|
cmp al, 9
|
||
|
jle .got_char
|
||
|
.no_input:
|
||
|
stc ; set CF
|
||
|
jmp .done
|
||
|
.loop:
|
||
|
xor rax,rax
|
||
|
lodsb
|
||
|
sub al, '0'
|
||
|
js .dec_done
|
||
|
cmp al, 9
|
||
|
jg .dec_done
|
||
|
.got_char:
|
||
|
xchg rdi,rax
|
||
|
mul rbx
|
||
|
add rdi,rax
|
||
|
jmp .loop
|
||
|
.dec_done:
|
||
|
clc ; clear CF
|
||
|
.done:
|
||
|
mov rax, rdi
|
||
|
mov rdi, [rsp+0]
|
||
|
mov rdx, [rsp+8]
|
||
|
mov rbx, [rsp+16]
|
||
|
add rsp, 24
|
||
|
ret
|
||
|
|
||
|
; string input in RSI
|
||
|
; value in RAX
|
||
|
; CF set if none, cear if some
|
||
|
; RSI set past checked area
|
||
|
hex_parse:
|
||
|
sub rsp, 24
|
||
|
mov [rsp+16], rbx
|
||
|
mov [rsp+8], rdx
|
||
|
mov [rsp+0], rdi
|
||
|
xor rax, rax
|
||
|
xor rdi, rdi
|
||
|
lodsb
|
||
|
cmp al, '0'
|
||
|
jb .no_input
|
||
|
cmp al, '9'
|
||
|
jbe .got_dec_char
|
||
|
cmp al, 'A'
|
||
|
jb .no_input
|
||
|
cmp al, 'F'
|
||
|
jbe .got_ualpha_char
|
||
|
cmp al, 'a'
|
||
|
jb .no_input
|
||
|
cmp al, 'f'
|
||
|
jbe .got_ualpha_char
|
||
|
.no_input:
|
||
|
stc ; set CF
|
||
|
jmp .done
|
||
|
.loop:
|
||
|
xor rax,rax
|
||
|
lodsb
|
||
|
cmp al, '0'
|
||
|
jb .hex_done
|
||
|
cmp al, '9'
|
||
|
jbe .got_dec_char
|
||
|
cmp al, 'A'
|
||
|
jb .hex_done
|
||
|
cmp al, 'F'
|
||
|
jbe .got_ualpha_char
|
||
|
cmp al, 'a'
|
||
|
jb .hex_done
|
||
|
cmp al, 'f'
|
||
|
jbe .got_ualpha_char
|
||
|
jmp .hex_done
|
||
|
.got_dec_char:
|
||
|
sub al, '0'
|
||
|
xchg rdi,rax
|
||
|
shl rax, 4
|
||
|
add rdi,rax
|
||
|
jmp .loop
|
||
|
.got_alpha_char:
|
||
|
sub al, 'A'-10
|
||
|
xchg rdi,rax
|
||
|
shl rax, 4
|
||
|
add rdi,rax
|
||
|
jmp .loop
|
||
|
.got_ualpha_char:
|
||
|
sub al, 'a'-10
|
||
|
xchg rdi,rax
|
||
|
shl rax, 4
|
||
|
add rdi,rax
|
||
|
jmp .loop
|
||
|
.hex_done:
|
||
|
clc ; clear CF
|
||
|
.done:
|
||
|
mov rax, rdi
|
||
|
mov rdi, [rsp+0]
|
||
|
mov rdx, [rsp+8]
|
||
|
mov rbx, [rsp+16]
|
||
|
add rsp, 24
|
||
|
ret
|
||
|
|
||
|
; --- MACROS ---
|
||
|
%define len(x) x %+ .over - x
|