99 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| ;; rax contains the integer
 | |
| ;; rbx contains a pointer to the string buffer
 | |
| itoa:
 | |
|    mov byte [rbx], '0'
 | |
| 
 | |
|    ;; Special case for the number '0'
 | |
|    cmp rax, 0
 | |
|    jne .not_zero
 | |
|    mov byte [rbx + 1], 0 
 | |
|    ret
 | |
| 
 | |
| .not_zero:
 | |
|    ;; Fill 6 digits with zeroes
 | |
|    mov byte [rbx + 1], '0'
 | |
|    mov byte [rbx + 2], '0'
 | |
|    mov byte [rbx + 3], '0'
 | |
|    mov byte [rbx + 4], '0'
 | |
|    mov byte [rbx + 5], '0'
 | |
| 
 | |
|    sub rax, 100000
 | |
|    inc byte [rbx]
 | |
|    cmp rax, 0
 | |
|    jge itoa
 | |
|    add rax, 100000
 | |
|    dec byte [rbx]
 | |
| .ten_thousand:
 | |
|    sub rax, 10000
 | |
|    inc byte [rbx + 1]
 | |
|    cmp rax, 0
 | |
|    jge .ten_thousand
 | |
|    add rax, 10000
 | |
|    dec byte [rbx + 1]
 | |
| .one_thousand:
 | |
|    sub rax, 1000
 | |
|    inc byte [rbx + 2]
 | |
|    cmp rax, 0
 | |
|    jge .one_thousand
 | |
|    add rax, 1000
 | |
|    dec byte [rbx + 2]
 | |
| .one_hundred:
 | |
|    sub rax, 100
 | |
|    inc byte [rbx + 3]
 | |
|    cmp rax, 0
 | |
|    jge .one_hundred
 | |
|    add rax, 100
 | |
|    dec byte [rbx + 3]
 | |
| .ten:
 | |
|    sub rax, 10
 | |
|    inc byte [rbx + 4]
 | |
|    cmp rax, 0
 | |
|    jge .ten
 | |
|    add rax, 10
 | |
|    dec byte [rbx + 4]
 | |
|    add [rbx + 5], rax
 | |
| 
 | |
| 
 | |
|    ;; Time to shift everything left
 | |
|    ;; End the current string with a null byte
 | |
|    mov byte [rbx + 6], 0
 | |
| .shift_left_loop:   
 | |
|    cmp byte [rbx], '0'
 | |
|    jne .done
 | |
| 
 | |
|    mov rcx, rbx
 | |
|    inc rcx
 | |
|    mov rdx, [rcx]
 | |
|    and rdx, 255
 | |
|    mov [rbx],     dx
 | |
| 
 | |
|    inc rcx
 | |
|    mov rdx, [rcx]
 | |
|    and rdx, 255
 | |
|    mov [rbx + 1], dx
 | |
| 
 | |
|    inc rcx
 | |
|    mov rdx, [rcx]
 | |
|    and rdx, 255
 | |
|    mov [rbx + 2], dx
 | |
| 
 | |
|    inc rcx
 | |
|    mov rdx, [rcx]
 | |
|    and rdx, 255
 | |
|    mov [rbx + 3], dx
 | |
| 
 | |
|    inc rcx
 | |
|    mov rdx, [rcx]
 | |
|    and rdx, 255
 | |
|    mov [rbx + 4], dx
 | |
| 
 | |
|    inc rcx
 | |
|    mov rdx, [rcx]
 | |
|    and rdx, 255
 | |
|    mov [rbx + 5], dx
 | |
| 
 | |
|    jmp .shift_left_loop
 | |
| 
 | |
| .done:
 | |
|    ret
 |