GNU/Linux xterm bash 91 views

📌 Demostración: Resta de dos números en memoria en ARM64 Assembly

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

🎯 Descripción

Este programa resta dos números en memoria y muestra el resultado en la terminal.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as resta.s -o resta.o  
ld resta.o -o resta 

▶️ Ejecución

./resta

👀 Código fuente

🔗 Código fuente en Gist: Programa 10 Resta de dos numeros 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/07                                                            |
| • Descripción: Programa que resta dos numeros y muestra                        |
|   resultado en terminal en Go y Assembly ARM64 para RaspbianOS.                |
| • Demostración:                                                                |
|   https://asciinema.org/a/712770                                               |
| • Compilación (Raspberry Pi ARM64):                                            |
|     as resta.s -o resta.o                                                      |
|     ld resta.o -o resta                                                        |
| • Ejecución: ./resta                                                           |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

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

package main

import "fmt"

func main() {
    // Definir los dos números
    num1 := 5
    num2 := 3
    
    // Realizar la resta
    resultado := num1 - num2
    
    // Mostrar el resultado
    fmt.Printf("La resta de %d - %d = %d\n", num1, num2, resultado)
}

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

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

.data
// Mensajes para mostrar
mensaje2:    .asciz  "5 - 3 = "
salto_linea: .asciz  "\n"

.text
.global _start

_start:

    // Realizar la resta: 5 - 3
    mov x3, #5          // cargar 5 en x3
    mov x4, #3          // cargar 3 en x4
    sub x5, x3, x4      // x5 = x3 - x4 (5 - 3)

    // Convertir el resultado a ASCII
    add x5, x5, #'0'    // convertir dígito a ASCII

    // Mostrar el mensaje "5 - 3 = "
    mov x0, #1          // stdout
    ldr x1, =mensaje2   // dirección del mensaje
    ldr x2, =8          // longitud del mensaje
    mov x8, #64         // syscall write
    svc #0

    // Mostrar el resultado (un solo dígito)
    // Necesitamos la dirección del resultado en memoria
    // Usamos la pila para almacenar temporalmente el resultado
    strb w5, [sp, #-16]! // almacenar byte en la pila y ajustar sp
    mov x0, #1          // stdout
    mov x1, sp          // dirección del resultado (en la pila)
    mov x2, #1          // longitud (1 byte)
    mov x8, #64         // syscall write
    svc #0
    add sp, sp, #16     // restaurar el puntero de pila

    // Mostrar salto de línea
    mov x0, #1          // stdout
    ldr x1, =salto_linea // dirección del salto de línea
    mov x2, #1          // longitud
    mov x8, #64         // syscall write
    svc #0

    // Salir del programa
    mov x0, #0          // código de salida 0
    mov x8, #93         // syscall exit
    svc #0