GNU/Linux xterm bash 134 views

Este código en ensamblador ARM64 para Raspberry Pi OS realiza una potenciación de enteros: calcula ( x^n ), donde x es la base y n el exponente (ambos ingresados por el usuario). Y lo hace sin usar bibliotecas matemáticas, solo con instrucciones de multiplicación y control de flujo.

Vamos a desmenuzarlo en español, paso por paso:


🧠 ¿Qué hace el programa?

El programa:

  1. Solicita una base (x) y un exponente (n) al usuario
  2. Verifica si el exponente es negativo → si lo es, muestra un error
  3. Si ( n = 0 ), muestra 1 como resultado (porque ( x^0 = 1 ))
  4. Si ( n > 0 ), realiza una multiplicación repetida:
    ( resultado = x \times x \times \dots \times x ) (n veces)
  5. Imprime el resultado

🗃️ Sección .data

msg_base:       "Ingrese la base (x): "
msg_exp:        "Ingrese el exponente (n): "
msg_resultado:  "El resultado de %d^%d es: %d\n"
msg_error:      "Error: exponente negativo no soportado\n"
formato_int:    "%d"

base:           .word 0
exponente:      .word 0

Variables:

  • base: almacena la base ingresada
  • exponente: almacena el exponente
  • Las cadenas de texto son mensajes para printf y scanf

🔧 Sección .text – Lógica principal

🎬 main – Entrada del programa

stp x29, x30, [sp, -16]!  ; Guardamos x29 y x30 en la pila
mov x29, sp               ; Configuramos el frame pointer

📥 Solicitar valores al usuario

adr x0, msg_base
bl printf

adr x0, formato_int
adr x1, base
bl scanf

Mismo patrón para el exponente.


📦 Cargar valores ingresados

ldr w19, [base]       ; base en w19
ldr w20, [exponente]  ; exponente en w20

⚠️ Validaciones

❌ Si el exponente es negativo:

cmp w20, #0
b.lt error_exp

Salta a error_exp y muestra el mensaje de error.

🎯 Si el exponente es 0:

cmp w20, #0
b.eq exp_cero

Y en exp_cero guarda 1 como resultado.


🔁 Bucle de potencia

mov w21, w19   ; resultado inicial = base
mov w22, #1    ; contador = 1

Repetir mientras contador < exponente:

cmp w22, w20
b.eq mostrar_resultado
mul w21, w21, w19   ; resultado *= base
add w22, w22, #1    ; contador++
b potencia_loop

🖨️ Mostrar resultado

adr x0, msg_resultado
mov w1, w19     ; base
mov w2, w20     ; exponente
mov w3, w21     ; resultado
bl printf

🧼 Fin del programa

ldp x29, x30, [sp], 16
ret