GNU/Linux xterm-256color bash 336 views

**
Nombre: sum.s

Autor: Karla Itzel Vazquez Cruz

Descripción: Solicita dos números enteros al usuario, los suma e imprime el resultado correctamente formateado en ARM64 Assembly.

Asciinema: https://asciinema.org/a/712750

Equivalente en C:

#include <stdio.h>
int main() {
    int a, b;
    printf("introduce numero 1: "); scanf("%d", &a);
    printf("introduce numero 2: "); scanf("%d", &b);
    int suma = a + b;
    printf("resultado: %d\n", suma);
    return 0;
}

Versión en ARM64 RaspbianOS Linux:

  .section .data
mensaje1:    .asciz "Ingresa el primer número: "
mensaje2:    .asciz "Ingresa el segundo número: "
resultado:   .asciz "La suma es: "
buffer:      .skip 10  // Buffer para entrada de números

    .section .text
    .global _start

_start:
    // Mostrar mensaje para el primer número
    mov x0, 1          // STDOUT (1)
    ldr x1, =mensaje1  // Dirección del mensaje
    mov x2, 25         // Tamaño del mensaje
    mov x8, 64         // syscall: write
    svc 0

    // Leer primer número
    mov x0, 0          // STDIN (0)
    ldr x1, =buffer    // Dirección del buffer
    mov x2, 10         // Tamaño máximo de entrada
    mov x8, 63         // syscall: read
    svc 0

    // Convertir primer número de ASCII a entero
    ldr x0, =buffer    // Dirección del buffer
    bl str_to_int      // Llama a la conversión
    mov x9, x0         // Guarda el primer número en x9

    // Mostrar mensaje para el segundo número
    mov x0, 1
    ldr x1, =mensaje2
    mov x2, 26
    mov x8, 64
    svc 0

    // Leer segundo número
    mov x0, 0
    ldr x1, =buffer
    mov x2, 10
    mov x8, 63
    svc 0

    // Convertir segundo número de ASCII a entero
    ldr x0, =buffer
    bl str_to_int
    mov x10, x0        // Guarda el segundo número en x10

    // Sumar los números
    add x0, x9, x10    // x0 = x9 + x10

    // Convertir entero a ASCII para imprimir
    bl int_to_str
    ldr x1, =buffer    // Dirección del buffer con el resultado

    // Mostrar el resultado
    mov x0, 1
    ldr x1, =resultado
    mov x2, 11
    mov x8, 64
    svc 0

    // Imprimir el número convertido
    mov x0, 1
    ldr x1, =buffer
    mov x2, 10
    mov x8, 64
    svc 0

    // Salir del programa
    mov x8, 93
    mov x0, 0
    svc 0

// ----------------------
// Convertir ASCII a entero
// ----------------------
str_to_int:
    mov x1, #0         // Inicializar resultado en 0
    mov x2, #10        // Factor de base 10

str_to_int_loop:
    ldrb w3, [x0], #1  // Cargar byte y avanzar puntero
    cmp w3, #10        // Comprobar si es salto de línea
    beq str_to_int_end
    sub w3, w3, #48    // Convertir ASCII a número
    mul x1, x1, x2     // Multiplicar por 10
    add x1, x1, x3     // Sumar nuevo dígito
    b str_to_int_loop

str_to_int_end:
    mov x0, x1         // Retornar resultado
    ret

// ----------------------
// Convertir entero a ASCII
// ----------------------
int_to_str:
    mov x2, #10        // Base 10
    ldr x1, =buffer    // Dirección del buffer
    add x1, x1, #9     // Apuntar al final
    mov w3, #0xA       // Caracter de nueva línea
    strb w3, [x1], #-1 // Agregar salto de línea

int_to_str_loop:
    udiv x3, x0, x2    // Dividir x0 entre 10
    msub x4, x3, x2, x0 // Obtener el residuo
    add x4, x4, #48    // Convertir a ASCII
    strb w4, [x1], #-1 // Almacenar caracter
    mov x0, x3         // Actualizar número
    cmp x0, #0
    bne int_to_str_loop

    ret

More recordings by Itzel

Browse all

CONTADOR PRIMOS 1:17

by Itzel

IMPRIMIR 10 1:27

by Itzel

untitled 2:38

by Itzel

PRACTICA02 2:26

by Itzel