;compilar:   nasm -g -f elfx convNum2Str.asm  onde x=32 ou x=64, geraria um hello.o
;ELF : excutable linkable format para ambiente unix like
;linkeditar: ld convNum2Str.o  -o convNum2Str  o objeto será o convNum2Str determinado pelo -o 
;executar:   ./convNum2Str
;Exemplo para converter um inteiro
;em string ASCII.
; *********************************************************
;Declaracao dos dados
section .data
; -----
    ; Define constantes
    NULL equ 0
    EXIT_SUCCESS equ 0 ; operacao com sucesso
    SYS_exit equ 60        ; codigo para terminar
    ; Define dados
    intNum dd 1498
    tamStrNum dd 0

; -----
;Variáveis não inicializadas
section .bss
    strNum resb 10     ;define um vetor de 10 células

; *********************************************************
section .text
    global _start
    _start:
    ; Converte um inteiro em uma string ASCII.
    ; -----
    ; Part A - Divisoes successivas
    mov eax, dword [intNum] ;pega o inteiro
    xor rcx,rcx             ;contDigitos = 0
    mov ebx, 10             ;prepara para dividir por 10
        
    divideLoop:
        mov edx, 0
        div ebx             ; divide o número por 10
        push rdx            ; armazena o resto
        inc rcx             ; incrementa contDigitos
        cmp eax, 0
    jne divideLoop ; if (resultado <> 0)
                   ; goto divideLoop  
    
    mov [tamStrNum],rcx     ; guarda a contagem de dígitos

    ; -----
    ; Part B - Converte o resto em string asc e armazena em strNum

    mov rbx, strNum ; pega o endereco da string
    mov rdi, 0  ; idx = 0
    popLoop:
        pop rax ; pop intDigit
        add al, "0" ; char = int + "0"

        mov byte [rbx+rdi], al ; string[idx] = char
        inc rdi  ; increment idx
    loop popLoop ; if (contDigitos > 0)
                 ;goto popLoop
    mov byte [rbx+rdi], NULL ; string[idx] = NULL
    ; -----
    ; Done, terminate program.
    
    ;Imprimir strNum
    ;tamStrNum dd 0
    ;printf("%d",intNum); 
    mov rax,1
    mov rdi,1
    mov rsi,strNum
    mov rdx,[tamStrNum] 
    syscall
    
     
    last:
    mov rax, SYS_exit     ;call code for exit
    mov rdi, EXIT_SUCCESS ;exit with sucess
    syscall
    
    
   
        
       



