GNU/Linux xterm-256color bash 152 views

//============================================================
// 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