GNU/Linux xterm-256color bash 130 views

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