typestar

print_decimal.asm en Assembly

De entero a decimal: divide por diez, arma los dígitos al revés.

; Print an unsigned number in decimal: divide by 10, push digits.

        global _start

        section .bss
buf:    resb 24                 ; plenty for a 64-bit decimal

        section .text
; rdi = number -> writes digits + newline to stdout
print_u64:
        lea rsi, [buf + 23]     ; build from the right
        mov byte [rsi], 10      ; trailing newline
        mov rax, rdi
        mov rcx, 10
.digit:
        xor rdx, rdx
        div rcx                 ; rax = quot, rdx = digit
        add dl, '0'
        dec rsi
        mov [rsi], dl
        test rax, rax
        jnz .digit

        lea rdx, [buf + 24]     ; length = end - start
        sub rdx, rsi
        mov rax, 1
        mov rdi, 1
        syscall                 ; rsi already points at the digits
        ret

_start:
        mov rdi, 0
        call print_u64          ; edge case: a lone zero

        mov rdi, 42
        call print_u64

        mov rdi, 1234567890
        call print_u64

        mov rax, 60
        xor rdi, rdi
        syscall

Cómo funciona

  1. Los dígitos salen invertidos; el buffer llena de derecha a izquierda.
  2. div rcx pela un dígito a rdx en cada pasada.
  3. El caso borde del cero imprime antes de que el bucle corriera.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
43
Caracteres a escribir
792
Tokens
115
Ritmo de tres estrellas
55 tpm

Al ritmo de tres estrellas de 55 tokens por minuto, este intento toma unos 125 segundos.

Escribe este fragmento

Paso 1 de 3 en Bis; paso 29 de 31 en Fundamentos del lenguaje.

← Anterior Siguiente →