Ive modified Paul Dixon's orignal atou_ex function for use with 64bit JWasm64. Return value in rax. Done some basic tests and it seemed to work - so fingers crossed that it continues to. If anything looks out of place let me know.
.686
.MMX
.XMM
.x64
option casemap : none
option win64 : 11
option frame : auto
option stackbase : rsp
atou_ex PROTO :QWORD
.code
;--------------------------------------------------------------------------------------------------------------------
; Convert ascii string pointed to by String param to unsigned qword value. Returns qword value in rax.
; Original code for atou_ex by Paul Dixon. Converted to 64bit support by fearless 2015
;--------------------------------------------------------------------------------------------------------------------
atou_ex PROC FRAME USES RCX RDX String:QWORD
; ------------------------------------------------
; Convert decimal string into UNSIGNED QWORD value
; ------------------------------------------------
mov rdx, String
xor rcx, rcx
movzx rax, BYTE PTR [rdx]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+1]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+2]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+3]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+4]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+5]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+6]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+7]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+8]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+9]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+10]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+11]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+12]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+13]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+14]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+15]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+16]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+17]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+18]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+19]
test rax, rax
jz quit
lea rcx, [rcx+rcx*4]
lea rcx, [rax+rcx*2-48]
movzx rax, BYTE PTR [rdx+20] ; if > 20 ascii chars in length will fall out.
test rax, rax
jnz out_of_range
quit:
lea rax, [rcx] ; return value in RAX
or rcx, -1 ; non zero in RCX for success
ret
out_of_range:
xor rax, rax ; zero return value on error
xor rcx, rcx ; zero in RCX is out of range error
ret
atou_ex endp
END