La guía aborda un problema práctico creciente: con la popularización de los ordenadores ARM de Apple, muchos desarrolladores escriben código ensamblador optimizado para estos equipos sin tener en cuenta otros dispositivos ARM64, como placas SBC o servidores con Linux o BSD. El resultado es ensamblador no portable que solo funciona en Darwin.
El texto explica las diferencias clave entre las ABIs de Mach-O (empleado por Apple) y ELF (utilizado por Linux, BSD y otros sistemas UNIX modernos). La principal diferencia al escribir ensamblador es que en Darwin todos los símbolos llevan un prefijo de guion bajo: una función declarada como unmask en C debe definirse como _unmask en ensamblador para Mach-O.
Otra diferencia importante es que ELF define distintas clases de datos mediante directivas como .type (con valores STT_FUNC o STT_OBJECT), mientras que Mach-O no tiene equivalente, por lo que esa directiva no funciona al ensamblar para Darwin. También hay matices en las ABIs de plataforma: el registro x18 está reservado por la ABI de Darwin y por Android, pero no por GNU/Linux ni Alpine, donde queda libre para uso general.
Un cuarto punto son los mnemónicos específicos de Apple para NEON. La sintaxis eor.16b v2, v2, v0 es una extensión propietaria; la sintaxis oficial de ARM exige indicar el layout de memoria en cada registro (eor v2.16b, v2.16b, v0.16b). La guía recomienda usar siempre la sintaxis ARM estándar.
Para resolver todo esto, el autor propone dos macros de preprocesador. La primera añade el guion bajo solo en Apple: PROC_NAME(unmask) se expande a _unmask en Darwin y a unmask en el resto. La segunda gestiona la directiva .type solo fuera del toolchain de Apple. Con estos dos mecanismos, un mismo archivo de ensamblador compila correctamente con Apple Clang, el toolchain oficial de ARM y el de GNU.
