GNU/Linux xterm bash 87 views

📌 Demostración: Calculadora de horas a segundos en ARM64 Assembly

💻 Lenguajes de Interfaz en TECNM Campus ITT
👨‍💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/10

🎯 Descripción

Este programa calcula las horas que le indique un usuario a segundos.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as horas_seg.s -o horas_seg.o  
ld horas_seg.o -o horas_seg

▶️ Ejecución

./horas_seg

👀 Código fuente

🔗 Código fuente en Gist: Programa 31 Convertidor de horas a segundos mostrando resultado en terminal Código Assembly ARM64 para RaspbianOS

/*
 ______  ____               ____  __ __      
/\  _  \/\  _`\   /'\_/`\  /'___\/\ \\ \     
\ \ \L\ \ \ \L\ \/\      \/\ \__/\ \ \\ \    
 \ \  __ \ \ ,  /\ \ \__\ \ \  _``\ \ \\ \_  
  \ \ \/\ \ \ \\ \\ \ \_/\ \ \ \L\ \ \__ ,__\
   \ \_\ \_\ \_\ \_\ \_\\ \_\ \____/\/_/\_\_/
    \/_/\/_/\/_/\/ /\/_/ \/_/\/___/    \/_/  
                                             
♡ ∩_∩ 
(„• ֊ •„)♡
| ̄U U ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| 
| • Lenguajes de Interfaz en TECNM Campus ITT                            |   
| • Autor: Alejandro Suarez Sandoval                                     | 
| • Fecha: 2025/04/10                                                    | 
| • Descripción: Programa que pasa horas a segundos mostrando            | 
|   resultado en terminal en Java y Assembly ARM64 para RaspbianOS.      | 
| • Demostración:                                                        |
|   https://asciinema.org/a/714449                                       |
| • Compilación (Raspberry Pi ARM64):                                    |  
|     as horas_seg.s -o horas_seg.o                                      |  
|     ld horas_seg.o -o horas_seg                                        |  
| • Ejecución: ./horas_Seg                                               |  
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄                                        

⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje Java •°•═══════

import java.util.Scanner;

public class HorasASegundos {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Por favor, introduce el número de horas: ");
        int horas = scanner.nextInt();

        int segundos = horas * 3600;

        System.out.println(segundos + " segundos.");

        scanner.close();
    }
}

════════════════════•°• ☆ •°•══════════════════════════════
/*

/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */

.global _start
.align 4

.section .data
    pregunta:   .asciz "Por favor, introduce el número de horas(enteras): "
    len_pregunta = . - pregunta
    
    resultado:  .asciz " segundos.\n"
    len_resultado = . - resultado
    
    buffer:     .fill 32, 1, 0  // Buffer para almacenar la entrada del usuario
    horas:      .dword 0        // Variable para almacenar las horas como entero
    segundos:   .dword 0        // Variable para almacenar los segundos calculados

.section .text
_start:
    // Mostrar pregunta al usuario
    mov x0, #1                  // Descriptor de archivo: stdout
    adr x1, pregunta            // Dirección del mensaje
    mov x2, len_pregunta        // Longitud del mensaje
    mov x8, #64                 // Llamada al sistema: write
    svc #0

    // Leer entrada del usuario
    mov x0, #0                  // Descriptor de archivo: stdin
    adr x1, buffer              // Buffer para almacenar la entrada
    mov x2, #32                 // Longitud máxima a leer
    mov x8, #63                 // Llamada al sistema: read
    svc #0

    // Convertir la entrada de ASCII a entero (horas)
    adr x1, buffer              // Dirección del buffer
    mov x2, #0                  // Inicializar contador
    mov x3, #0                  // Inicializar acumulador

convert_loop:
    ldrb w4, [x1, x2]           // Cargar byte actual
    cmp w4, #10                 // Verificar si es salto de línea (fin de entrada)
    beq convert_done
    sub w4, w4, #'0'            // Convertir ASCII a dígito
    mov x5, #10
    mul x3, x3, x5              // Multiplicar acumulador por 10
    add x3, x3, x4              // Sumar dígito actual
    add x2, x2, #1              // Incrementar contador
    b convert_loop

convert_done:
    adr x4, horas
    str x3, [x4]                // Almacenar valor de horas

    // Calcular segundos (horas * 3600)
    mov x5, #3600
    mul x3, x3, x5
    adr x4, segundos
    str x3, [x4]                // Almacenar valor de segundos

    // Convertir segundos a ASCII para mostrarlos
    adr x1, buffer + 31         // Empezar al final del buffer
    mov w2, #0                  // Terminador nulo
    strb w2, [x1]               // Almacenar terminador
    mov x2, #10                 // Base decimal

    mov x0, x3                  // Valor a convertir (segundos)
    cmp x0, #0                  // Caso especial para cero
    bne convert_loop2
    mov w3, #'0'
    sub x1, x1, #1
    strb w3, [x1]
    b print_result

convert_loop2:
    cmp x0, #0                  // ¿Ya hemos terminado?
    beq print_result
    udiv x3, x0, x2             // Dividir por 10
    msub x4, x3, x2, x0         // Obtener residuo (x4 = x0 - (x3 * x2))
    add w4, w4, #'0'            // Convertir a ASCII
    sub x1, x1, #1              // Mover puntero hacia atrás
    strb w4, [x1]               // Almacenar dígito
    mov x0, x3                  // Actualizar cociente
    b convert_loop2

print_result:
    // Calcular longitud del número
    adr x2, buffer + 31
    sub x2, x2, x1              // Longitud del string numérico
    add x2, x2, #1

    // Mostrar el número de segundos
    mov x0, #1                  // stdout
    mov x8, #64                 // write
    svc #0

    // Mostrar texto " segundos.\n"
    mov x0, #1                  // stdout
    adr x1, resultado           // Texto a mostrar
    mov x2, len_resultado       // Longitud del texto
    mov x8, #64                 // write
    svc #0

    // Salir del programa
    mov x0, #0                  // Código de salida: 0 (éxito)
    mov x8, #93                 // Llamada al sistema: exit
    svc #0