GNU/Linux xterm-256color bash 220 views

**
Nombre: reversa.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 02-04-2025
Descripción: Programa en ARM64 Assembly para leer una cadena y mostrarla en orden inverso.
Plataforma: Raspberry Pi OS 64-bit
Asciinema: reversa.s
**

Equivalente en C:

#include <stdio.h>
int main() {
    char buffer[256];
    printf("Ingrese una cadena: ");
    fgets(buffer, 256, stdin);
    printf("Cadena en reversa: ");
    int len = 0;
    while (buffer[len] != '\n' && buffer[len] != '\0') len++;
    for (int i = len - 1; i >= 0; i--) putchar(buffer[i]);
    putchar('\n');
    return 0;
}

Versión en ARM64 RaspbianOS Linux:

.section .bss
buffer:     .skip 256              // Buffer para entrada de usuario

.section .data
mensaje:    .asciz "Ingrese una cadena: "
resultado:  .asciz "Cadena en reversa: "
nl:         .asciz "\n"            // Salto de línea

.section .text
.global _start

_start:
    // Mostrar mensaje de entrada
    mov x0, #1                      // stdout
    ldr x1, =mensaje                // Dirección del mensaje
    mov x2, #19                     // Longitud del mensaje
    mov x8, #64                     // syscall write
    svc #0

    // Leer entrada del usuario
    mov x0, #0                      // stdin
    ldr x1, =buffer                 // Dirección del buffer
    mov x2, #255                    // Tamaño máximo
    mov x8, #63                     // syscall read
    svc #0
    // x0 ahora contiene bytes leídos (opcional)

    // Encontrar longitud sin contar '\n'
    ldr x1, =buffer                 // Puntero actual
    mov x3, x1                      // Guardar inicio original

buscar_fin:
    ldrb w2, [x1], #1               // Leer byte y avanzar
    cmp w2, #0xA                    // ¿es newline?
    beq ajustar_final
    cmp w2, #0                      // ¿es null?
    beq ajustar_final
    b buscar_fin

ajustar_final:
    sub x1, x1, #2                  // Retroceder para ignorar newline
    mov x4, x1                      // Guardar puntero final

    // Mostrar mensaje "Cadena en reversa:"
    mov x0, #1
    ldr x1, =resultado
    mov x2, #19
    mov x8, #64
    svc #0

// Imprimir en reversa desde x4 hasta x3
imprimir_invertido:
    cmp x4, x3                      // ¿x4 < x3?
    blt imprimir_salto
    ldrb w2, [x4], #-1              // Leer byte y retroceder
    mov x1, sp                      // Usar stack como buffer temporal
    strb w2, [x1]                   // Guardar byte
    mov x0, #1                      // stdout
    mov x2, #1                      // longitud = 1
    mov x8, #64                     // syscall write
    svc #0
    b imprimir_invertido

// Imprimir salto de línea
imprimir_salto:
    mov x0, #1
    ldr x1, =nl
    mov x2, #1
    mov x8, #64
    svc #0

// Terminar programa
fin_programa:
    mov x8, #93                     // syscall exit
    mov x0, #0
    svc #0

More recordings by Itzel

Browse all

MULTIPLO 5 5:00

by Itzel

MINISCULA A MAYUSCULAS 0:44

by Itzel

OCTAL A BINARIO 1:06

by Itzel