Programa 31: Calculadora de horas a segundos con entrada de horas por el usuario en Assembly ARM64 - Alejandro Suarez
by pepinisillo
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