// =====================================================
// Autor: Victor Madrid Lugo
// Fecha: 03/04/2025
// Descripción: Resta dos números enteros ingresados por el usuario en Raspbian OS
// Demostración: [https://asciinema.org/a/TX2bdqQn3gyHMrDVli89NQg0b]
// =====================================================
/* Codigo en GO
package main
import (
"fmt"
)
func main() {
var num1, num2 int
fmt.Print("Ingrese el primer número: ")
fmt.Scan(&num1)
fmt.Print("Ingrese el segundo número: ")
fmt.Scan(&num2)
resultado := num1 - num2
fmt.Printf("El resultado de la resta es: %d\n", resultado)
}
*/
.section .data
msg1: .asciz "Ingrese el primer número: "
msg2: .asciz "Ingrese el segundo número: "
msg3: .asciz "El resultado de la resta es: "
newline: .asciz "\n"
buffer: .skip 10 // Espacio para almacenar entrada del usuario
.section .text
.global _start
_start:
// Mostrar mensaje 1
mov x0, 1
ldr x1, =msg1
mov x2, 27
mov x8, 64
svc 0
// Leer primer número
mov x0, 0
ldr x1, =buffer
mov x2, 10
mov x8, 63
svc 0
// Convertir a entero
ldr x0, =buffer
bl atoi
mov x20, x0
// Mostrar mensaje 2
mov x0, 1
ldr x1, =msg2
mov x2, 27
mov x8, 64
svc 0
// Leer segundo número
mov x0, 0
ldr x1, =buffer
mov x2, 10
mov x8, 63
svc 0
// Convertir a entero
ldr x0, =buffer
bl atoi
mov x21, x0
// Restar los números
sub x22, x20, x21 // x22 = x20 - x21
// Mostrar mensaje del resultado
mov x0, 1
ldr x1, =msg3
mov x2, 30
mov x8, 64
svc 0
// Imprimir resultado como número
mov x0, x22
bl print_int
// Imprimir salto de línea
mov x0, 1
ldr x1, =newline
mov x2, 1
mov x8, 64
svc 0
// Salir
mov x8, 93
mov x0, 0
svc 0
// =====================================================
// Función atoi: Convierte string en número entero
// =====================================================
atoi:
mov x1, #0
atoi_loop:
ldrb w2, [x0], #1
cmp w2, #48
blt atoi_done
cmp w2, #57
bgt atoi_done
sub w2, w2, #48
mov x3, #10
mul x1, x1, x3
add x1, x1, x2
b atoi_loop
atoi_done:
mov x0, x1
ret
// =====================================================
// Función print_int: Imprime un número en pantalla
// =====================================================
print_int:
sub sp, sp, #16
mov x1, sp
mov x2, #10
print_int_loop:
mov x3, #10
udiv x4, x0, x3
msub x5, x4, x3, x0
add x5, x5, #48
sub x2, x2, #1
strb w5, [x1, x2]
mov x0, x4
cbnz x0, print_int_loop
// Imprimir número
mov x0, 1
add x1, x1, x2
mov x8, 64
svc 0
add sp, sp, #16
ret