//============================================================
// Autor: Madrid Lugo Victor Manuel
// Fecha: 06/04/2025
// Descripción: Convertir un número decimal a binario y mostrarlo
// Programa: Convertir decimal a binario en ARM64 Assembly
// Demostración:[https://asciinema.org/a/MHBw6Uuhe0BigKDhyrSjBPfGQ]
//============================================================
// Equivalente en C#:
//
// int n = 42;
// string bin = Convert.ToString(n, 2);
// Console.WriteLine(bin);
//============================================================
.global _start // Punto de entrada global
.data
msg: .ascii "El numero en binario es: "
msg_len = . - msg
result: .fill 65, 1, 0 // Espacio para el resultado binario (64 bits + null)
newline: .ascii "\n" // Carácter de nueva línea
.text
_start:
// Usar 42 como número de ejemplo (puedes cambiarlo)
MOV X0, #42 // X0 = número a convertir
// Imprimir mensaje inicial
MOV X0, #1 // stdout
ADR X1, msg // dirección del mensaje
MOV X2, msg_len // longitud del mensaje
MOV X8, #64 // syscall write
SVC #0 // llamada al sistema
// Preparar para la conversión
MOV X9, X0 // Guardar número original en X9 (ya que X0 se usó para imprimir)
MOV X0, #42 // Restaurar el número a convertir
ADR X1, result // X1 = dirección del buffer de resultado
MOV X2, #64 // X2 = contador de posición (64 bits)
ADD X1, X1, X2 // Posicionar al final del buffer
MOV X3, #0 // X3 = null terminator
STRB W3, [X1] // Colocar null al final
SUB X1, X1, #1 // Mover al último carácter
// Si el número es 0, manejar especialmente
CMP X0, #0
B.NE convert_loop
MOV W3, #'0' // Carácter '0'
STRB W3, [X1] // Guardar '0' en el resultado
B print_result
convert_loop:
CBZ X0, check_result // Si X0 es 0, terminamos
// Obtener el bit menos significativo
AND X4, X0, #1 // X4 = X0 & 1 (último bit)
ADD W4, W4, #'0' // Convertir a carácter ASCII
STRB W4, [X1], #-1 // Guardar en buffer y mover puntero atrás
// Desplazar a la derecha
LSR X0, X0, #1 // X0 >>= 1
B convert_loop // Repetir
check_result:
// El puntero X1 está una posición antes del primer dígito
ADD X1, X1, #1 // Ajustar al primer dígito
// Calcular la longitud real del resultado
ADR X4, result // X4 = inicio del buffer
ADD X4, X4, #64 // X4 = posición después del buffer
SUB X2, X4, X1 // X2 = longitud real del resultado (X4 - X1)
print_result:
// Imprimir el resultado binario
MOV X0, #1 // stdout
// X1 ya contiene la dirección del inicio del resultado
// X2 ya contiene la longitud del resultado
MOV X8, #64 // syscall write
SVC #0 // llamada al sistema
// Imprimir nueva línea
MOV X0, #1 // stdout
ADR X1, newline // dirección de nueva línea
MOV X2, #1 // longitud
MOV X8, #64 // syscall write
SVC #0 // llamada al sistema
// Salir
MOV X0, #0 // código de retorno
MOV X8, #93 // syscall exit
SVC #0 // llamada al sistema