Cómo se codifican realmente las instrucciones ARM64

Fuentes: How ARM64 Instructions Are Really Encoded

Este artículo explica, paso a paso y sobre ejemplos reales ejecutados en Apple Silicon, cómo el procesador ARM64 codifica cada instrucción en una palabra fija de 32 bits. A diferencia de x86, donde las instrucciones pueden ocupar entre uno y quince bytes, AArch64 utiliza siempre cuatro bytes por instrucción, lo que facilita enormemente su decodificación manual y por software.

El texto parte de una instrucción cotidiana, "add x0, x1, #42", y muestra cómo el ensamblador la traduce a la palabra hexadecimal 9100A820 y, a continuación, a su forma binaria 10010001000000001010100000100000. A partir de ahí, desglosa cada campo: un opcode de diez bits que identifica la operación, un inmediato de doce bits con el valor 42, un campo Rn de cinco bits que señala el registro origen X1 y un campo Rd de cinco bits que indica el registro destino X0. El artículo aclara por qué cinco bits bastan para identificar cualquiera de los 32 registros de propósito general del procesador.

El recorrido continúa con las instrucciones de salto, que en lugar de almacenar la dirección completa guardan un desplazamiento relativo de 26 bits, suficiente para alcanzar ±128 MiB. Después aborda la célebre pareja "adrp" y "add" que aparece en casi todo ejecutable de macOS sobre Apple Silicon: ADRP calcula la base de una página de 4 KiB alineada respecto a la instrucción actual, y la ADD posterior restaura el desplazamiento dentro de la página. Esta técnica es esencial para generar código independiente de la posición, ya que el sistema operativo puede cargar los binarios en direcciones virtuales distintas en cada ejecución.

Finalmente, el texto conecta esta comprensión con herramientas逆向 conocidas como otool, llvm-objdump, Hopper, IDA o Ghidra, que automatizan ese mismo proceso de decodificación miles o millones de veces. La conclusión operativa es que entender la estructura de bits de ARM64 convierte a esas herramientas de cajas opacas en instrumentos comprensibles.