65 lines
731 B
NASM
65 lines
731 B
NASM
|
extern libz_strlen
|
||
|
|
||
|
global libz_hextoi
|
||
|
|
||
|
section .text
|
||
|
|
||
|
libz_hextoi:
|
||
|
|
||
|
|
||
|
; mov r11, rdi ;saveing it for later
|
||
|
|
||
|
push rdi
|
||
|
call libz_strlen
|
||
|
mov r9, rax
|
||
|
pop rdi
|
||
|
|
||
|
xor r10, r10
|
||
|
|
||
|
mov rcx, 1
|
||
|
add r9, rdi
|
||
|
dec r9
|
||
|
|
||
|
_loop:
|
||
|
|
||
|
xor rax, rax
|
||
|
mov al, [r9]
|
||
|
|
||
|
cmp rax, 48
|
||
|
jb _nan
|
||
|
cmp rax, 70 ;if its not a number then return 0 then exit
|
||
|
ja _nan ;this actually as a bug if you put a : it will be allowed
|
||
|
|
||
|
; push rax
|
||
|
|
||
|
cmp rax, 58 ;if(char < 58){sub char, 48}else{sub char, 55}
|
||
|
jb _charbelow
|
||
|
sub rax, 55
|
||
|
jmp _hexitif
|
||
|
_charbelow:
|
||
|
sub rax, 48
|
||
|
_hexitif:
|
||
|
|
||
|
mul rcx
|
||
|
add r10, rax
|
||
|
; pop rax
|
||
|
|
||
|
cmp r9, rdi
|
||
|
je _end
|
||
|
dec r9
|
||
|
; push rax
|
||
|
mov rax, 16
|
||
|
mul rcx
|
||
|
mov rcx, rax
|
||
|
; pop rax
|
||
|
|
||
|
jmp _loop
|
||
|
|
||
|
_nan:
|
||
|
xor r10, r10
|
||
|
|
||
|
_end:
|
||
|
mov rax, r10
|
||
|
ret
|
||
|
|