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:
-
Solicita una base (x) y un exponente (n) al usuario
-
Verifica si el exponente es negativo → si lo es, muestra un error
-
Si ( n = 0 ), muestra 1 como resultado (porque ( x^0 = 1 ))
-
Si ( n > 0 ), realiza una multiplicación repetida:
( resultado = x \times x \times \dots \times x ) (n veces)
-
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