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
- Los dígitos salen invertidos; el buffer llena de derecha a izquierda.
div rcxpela un dígito a rdx en cada pasada.- El caso borde del cero imprime antes de que el bucle corriera.
Palabras clave y builtins usados aquí
bytedlglobalraxrcxrdirdxresbrsisection
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.
Paso 1 de 3 en Bis; paso 29 de 31 en Fundamentos del lenguaje.