71 lines
1.4 KiB
NASM
71 lines
1.4 KiB
NASM
section .text
|
|
global int_to_str
|
|
|
|
;; Converts integer in rcx to string at rdx
|
|
;; rcx: input integer
|
|
;; rdx: pointer to output buffer (at least 21 bytes)
|
|
int_to_str:
|
|
mov rbx, rdx ; rbx = buffer pointer
|
|
mov r8, rbx ; r8 = start of buffer
|
|
|
|
; Check sign
|
|
mov rdx, rcx ; copy value
|
|
sar rdx, 63 ; rdx = 0 if positive, -1 if negative
|
|
cmp rdx, 0
|
|
jne .negative
|
|
|
|
.positive:
|
|
mov rsi, rcx
|
|
jmp .convert
|
|
|
|
.negative:
|
|
mov byte [rbx], '-' ; write minus sign
|
|
inc rbx
|
|
neg rcx
|
|
mov rsi, rcx
|
|
|
|
.convert:
|
|
; Count digits
|
|
mov rax, rsi
|
|
mov r9, rbx
|
|
mov r10, 0 ; digit count
|
|
mov r11, 10
|
|
|
|
test rax, rax
|
|
jnz .digits_loop
|
|
mov byte [rbx], '0'
|
|
inc rbx
|
|
mov r10, 1
|
|
jmp .done_digits
|
|
|
|
.digits_loop:
|
|
mov rdx, 0
|
|
div r11 ; rax = rax / 10, rdx = rax % 10
|
|
add rdx, '0' ; convert digit to ASCII
|
|
mov byte [rbx + r10], dl
|
|
inc r10
|
|
test rax, rax
|
|
jnz .digits_loop
|
|
|
|
.done_digits:
|
|
; Digits are in reverse order in [rbx..rbx+r10)
|
|
; Reverse them
|
|
mov rsi, 0
|
|
mov rdi, rbx
|
|
mov rdx, r10
|
|
dec rdx ; last digit index
|
|
.reverse_loop:
|
|
cmp rsi, rdx
|
|
jae .done_reverse
|
|
mov al, [rdi + rsi]
|
|
mov bl, [rdi + rdx]
|
|
mov [rdi + rsi], bl
|
|
mov [rdi + rdx], al
|
|
inc rsi
|
|
dec rdx
|
|
jmp .reverse_loop
|
|
.done_reverse:
|
|
add rbx, r10 ; move pointer past digits
|
|
mov byte [rbx], 0 ; null-terminate
|
|
ret
|