Skip to content

Instantly share code, notes, and snippets.

@tnewman
Last active August 24, 2025 10:38
Show Gist options
  • Select an option

  • Save tnewman/63b64284196301c4569f750a08ef52b2 to your computer and use it in GitHub Desktop.

Select an option

Save tnewman/63b64284196301c4569f750a08ef52b2 to your computer and use it in GitHub Desktop.
atoi in Assembly - Convert a number string to a 64 bit integer.
global atoi
section .text
atoi:
mov rax, 0 ; Set initial total to 0
convert:
movzx rsi, byte [rdi] ; Get the current character
test rsi, rsi ; Check for \0
je done
cmp rsi, 48 ; Anything less than 0 is invalid
jl error
cmp rsi, 57 ; Anything greater than 9 is invalid
jg error
sub rsi, 48 ; Convert from ASCII to decimal
imul rax, 10 ; Multiply total by 10
add rax, rsi ; Add current digit to total
inc rdi ; Get the address of the next character
jmp convert
error:
mov rax, -1 ; Return -1 on error
done:
ret ; Return total or error code
@tnewman
Copy link
Author

tnewman commented Jan 2, 2024

Negative numbers are not supported in this snippet. You'd have to check for a leading - and negate the final result if negative.

@Zeykouille
Copy link

Negative numbers are not supported in this snippet. You'd have to check for a leading - and negate the final result if negative.

That's what I did, thx

@tetram2674562
Copy link

Nice code ;)

@a2kvarnstrom
Copy link

quick (somewhat unrelated) newbie question, if the code starts at the atoi subroutine, how does the rest of the code get called?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment