3 Isa Armv8-A Brief
3 Isa Armv8-A Brief
3 Isa Armv8-A Brief
El conjunto
Conectar de instrucciones
la guía del usuario A64
Versión
Versión 0.11.0
BRAZO
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
DD1ID113009
Página 1 de 35 BRAZO 100898_0100_es
Machine Translated by Google
Información de revisión
Aviso de propiedad
™
Palabras y logotipos marcados con ® o UE son marcas registradas o marcas comerciales de ARM® en el
y otros países, excepto que se indique lo contrario a continuación en este aviso de propiedad. Otras marcas y nombres
mencionados aquí pueden ser marcas comerciales de sus respectivos propietarios.
Ni la totalidad ni parte de la información contenida en, o el producto descrito en este documento puede ser adaptado o
reproducido en cualquier forma material excepto con el permiso previo por escrito del titular de los derechos de autor.
Este documento está destinado únicamente a ayudar al lector en el uso del producto. ARM no será responsable de
ninguna pérdida o daño que surja del uso de cualquier información en este documento, o cualquier error u omisión en dicha
información, o cualquier uso incorrecto del producto.
Cuando se utiliza el término ARM, significa “ARM o cualquiera de sus subsidiarias, según corresponda”.
Estado de confidencialidad
Este documento es Confidencial. El derecho a usar, copiar y divulgar este documento puede estar sujeto a
restricciones de licencia de acuerdo con los términos del acuerdo celebrado por ARM y la parte a la que ARM entregó
este documento.
Dirección web
http://www.brazo.com
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Contenido
3.3 SIMD (NEON) y cargas y almacenamientos escalares de coma flotante .................................. ....................................21
3.4 Especificación de la dirección para una instrucción Cargar o Almacenar .................................. .................................... 22
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
La adición de A64 brinda acceso a registros de enteros de 64 bits de ancho y operaciones de datos, y la capacidad de usar
punteros de memoria de tamaño de 64 bits. Las instrucciones A64 se ejecutan en el estado de ejecución AArch64. ARMv8-A
también incluye el conjunto de instrucciones ARM® original , ahora llamado A32, y el conjunto de instrucciones Thumb® (T32).
Es posible que los programadores que escriben a nivel de aplicación nunca necesiten escribir código en lenguaje ensamblador.
Sin embargo, el código ensamblador puede ser útil en los casos en que se requiere un código altamente optimizado. Este es el
caso cuando se escriben compiladores, o cuando se requiere el uso de funciones de bajo nivel que no están disponibles
directamente en C, por ejemplo:
• Controladores de dispositivo.
Leer el código ensamblador puede ser útil para depurar C, en particular para comprender la asignación entre las instrucciones
ensambladoras y las instrucciones C.
AGREGAR X0, X1, W2, SXTW // agregar registro de signo extendido de 32 bits a 64 bits
// registro extendido
AGREGAR V0.8H, V1.8H, V2.8H // Añadir NEON de 16 bits, en cada uno de los 8 carriles
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
• La inyección se desplaza hacia la derecha y gira en el bit 31, en lugar del bit 63.
• Los indicadores de condición, cuando los establece la instrucción, se calculan a partir de los 32 bits inferiores.
Esta distinción se aplica incluso cuando los resultados de un formulario de registro de 32 bits serían indistinguibles de los 32 bits inferiores
calculados por el formulario de registro equivalente de 64 bits. Por ejemplo, A64 incluye formularios de registro separados de 32 y 64 bits de las
instrucciones ORR . Un ORR bit a bit de 32 bits podría realizarse con la misma facilidad utilizando un ORR de 64 bits e ignorando los 32 bits
superiores del resultado.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Las instrucciones de procesamiento de datos utilizan principalmente un registro de destino y dos operandos de origen.
El formato general se puede considerar como la instrucción, seguida de los operandos, de la siguiente manera:
Dónde
Rd es el registro de destino.
Escribe Instrucciones
Algunas de estas instrucciones también tienen un sufijo S , lo que indica que la instrucción establece banderas.
De las instrucciones anteriores, las que llevan el sufijo incluyen ADDS, SUBS, ADCS, SBCS, ANDS y BICS.
Hay otras instrucciones de configuración de banderas, en particular CMP, CMN y TST, pero estas no toman una S
sufijo.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Las operaciones ADC y SBC realizan sumas y restas que también utilizan el indicador de condición de acarreo como entrada.
CAD{S}: Rd = Rn + Rm + C
SBC{S}: Rd = Rn - Rm - 1 + C
Por ejemplo:
Círculo
Las operaciones lógicas son las mismas que los operadores booleanos correspondientes que operan en bits
individuales del registro.
Por ejemplo:
Y X2, X2, X1
•
Invierte operando2.
Por ejemplo, para borrar el bit [11] del registro X0, utilice:
MOVX1, #0x800
BIC X0, X0, X1
Las instrucciones de comparación solo modifican las banderas y no tienen ningún otro efecto. El rango de valores
inmediatos para estas instrucciones es de 12 bits y el valor inmediato se puede desplazar 12 bits hacia la izquierda.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Las instrucciones de multiplicación que se proporcionan son muy similares a las de ARMv7-A, pero tienen la capacidad de realizar
multiplicaciones de 64 bits en una sola instrucción.
Instrucción Descripción
mul Multiplicar
Hay instrucciones de multiplicación que operan en valores de 32 o 64 bits y devuelven un resultado del mismo tamaño que los operandos.
Por ejemplo, se pueden multiplicar dos registros de 64 bits para producir un resultado de 64 bits con la instrucción MUL . Cualquier
desbordamiento se ignora y el resultado se toma como los 64 bits inferiores.
También existe la posibilidad de sumar o restar un valor acumulador en un tercer registro fuente, utilizando las instrucciones MADD o MSUB .
Además, hay una variedad de instrucciones de multiplicación que producen un resultado largo, es decir, multiplicar dos números de 32 bits
y generar un resultado de 64 bits. Hay variantes firmadas y no firmadas de estos
multiplicaciones largas (UMULL, SMULL). También hay opciones para acumular un valor de otro registro
(UMADDL, SMADDL) o para negar (UMNEGL, SMNEGL).
La inclusión de la multiplicación de 32 y 64 bits con acumulación opcional da como resultado un tamaño del mismo tamaño que los
operandos. Nuevamente, se ignora cualquier desbordamiento y el resultado se toma como los 64 bits inferiores del cálculo:
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Tanto la ampliación firmada como la no firmada se multiplican con la acumulación y dan un único resultado de 64 bits:
Una multiplicación de 64 × 64 a 128 bits tiene el potencial de generar un resultado mayor que 64 bits.
Esto hace que el registro de resultados de la instrucción MUL estándar se desborde. En este caso, las instrucciones de
multiplicación alta con signo/sin signo (SMULH, UMULH) capturan los bits del resultado perdidos por el desbordamiento en otro
registro.
MOVIMIENTO
X0, #0xFFFFFFFFFFFFFFFF
MOVIMIENTO
X1, #0x2
Instrucción Descripción
Por ejemplo:
o INT_MIN / -1 devuelve INT_MIN, donde INT_MIN es el número negativo más pequeño que se puede codificar en los
registros que se utilizan para la operación. El resultado siempre se redondea hacia cero, como en la mayoría de
los dialectos de C/C++.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
• Desplazamiento lógico a la izquierda (LSL). La instrucción LSL realiza la multiplicación por una potencia de 2.
• Desplazamiento lógico a la derecha (LSR). La instrucción LSR realiza la división por una potencia de 2.
• Desplazamiento aritmético a la derecha (ASR). La instrucción ASR realiza la división por una potencia de 2, conservando
el bit de signo.
• Girar a la derecha (ROR). La instrucción ROR realiza una rotación bit a bit, envolviendo los bits rotados del LSB al MSB.
bit de signo
Los bits
Registro Registro
desplazados se pierden
El registro que se especifica para un desplazamiento puede ser de 32 bits o de 64 bits. La cantidad a desplazar puede ser
inmediata, es decir, hasta (Tamaño de registro - 1), o por un registro donde el valor se toma solo de los cinco (módulo-32) o
seis (módulo-64) bits inferiores.
Por ejemplo
MOV X0,X0,LSL #8
MOV W0,W0,ASR #2
La siguiente tabla contiene instrucciones aritméticas que pueden contener operandos desplazados:
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Instrucción Descripción
Agregar
AGREGAR
SUB Sustraer
CMP Comparar
NEG Negar
Los operadores de turno LSL, ASR y LSR tienen los mismos nombres y realizan las mismas acciones que las instrucciones de turno.
Los operadores de desplazamiento toman un registro fuente y lo desplazan hacia la izquierda o hacia la derecha el número especificado
de bits, con extensión de signo opcional. Omitir el operador de turno significa que no hay turno. Las operaciones de cambio son en su
mayoría las mismas que en A32 y T32.
La cantidad de cambio está codificada en la instrucción (y por lo tanto es constante). Una diferencia significativa con A32 es que no hay
formularios de registro desplazado por registro. Tales operaciones son posibles en A64, pero como en T32, son instrucciones
independientes con una sintaxis ligeramente diferente.
Para todos los modificadores de desplazamiento, el tamaño del resultado es el mismo que el tamaño de la fuente. No hay una
ampliación o reducción implícita. Estos modificadores son el equivalente A64 del operando flexible que a menudo se llama Operand2 en
A32 y T32.
<operación> #imm
Dónde
Por ejemplo
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Instrucción Descripción
El puntero de pila actual, SP o WSP, no se puede utilizar con esta clase de instrucciones.
Por ejemplo:
Las instrucciones de campo de bits incluyen inserción de campo de bits (BFI) y extracción de campo de bits con y sin signo ((S/
U)BFX). También hay instrucciones de campo de bits adicionales, como BFXIL (Extracción de campo de bits e inserción baja), UBFIZ
(Inserción de campo de bits sin signo en cero) y SBFIZ (Inserción de campo de bits con signo en cero).
También es posible ampliar y desplazar el registro de operandos de una instrucción ADD, SUB, CMN o CMP y el registro de
índice de una instrucción de carga o almacenamiento. Esto da como resultado una implementación eficiente de los cálculos
de índice de matriz utilizando un puntero de matriz de 64 bits y un índice de matriz de 32 bits, como se muestra en la
siguiente figura:
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
31 0
000000001010110001001 1 1001110100
31 0
000000001010110001 10100001110100
31 0
0000000000000000000000000010101 1
Extensión cero
0
BFC W1, WZR, #3, #4 ;Borrar campo de bits
31 0
0000000000000000000000000000001 1
Nota
• Sin embargo, no es necesario utilizar estas instrucciones explícitamente, ya que se proporcionan alias para
todos los casos.
• Estos alias son las operaciones de campo de bits ya descritas: (S/U)XT(B/H/W/X), ASR/LSL/LSR
inmediato, BFI, BFXIL, SBFIZ, SBFX, UBFIZ y UBFX.
•
CLZ Cuenta los bits cero iniciales en un registro. Del mismo modo, las mismas instrucciones de manipulación de bytes:
•
REV Invierte el orden de los bytes de un registro.
•
REV16 Invierte el orden de los bytes de cada media palabra en un registro.
Xn
xd
•
REV32 Invierte el orden de los bytes de cada palabra en un registro.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Xn
xd
Estas operaciones se pueden realizar en registros de tamaño de palabra (32 bits) o doble palabra (64 bits), excepto REV32, que se aplica solo a
registros de 64 bits.
Operadores de extensión
Las instrucciones de registro extendidas proporcionan una extensión de signo opcional o una extensión de cero de una parte del valor
del registro del operando, seguido de un desplazamiento a la izquierda opcional por una cantidad constante de 1-
4, inclusive.
Instrucción Descripción
Agregar
AGREGAR
SUB Sustraer
CMP Comparar
Los operadores de extensión toman una secuencia de bits consecutivos del registro de origen, luego lo firman o lo extienden a cero para que
tenga el tamaño requerido. Nuevamente, los operadores tienen los mismos nombres y realizan las mismas acciones que la instrucción descrita
en las instrucciones de manipulación de bytes y campos de bits, pero con algunas diferencias. Por ejemplo, no hay instrucciones {S/U}XTW o {S/
U}XTX .
El tamaño del resultado está implícito en el contexto. La mayoría de estas operaciones extendidas existen en A32 y T32, pero son más
flexibles en A64 y, a menudo, se pueden usar como un modificador de operando.
Varios contextos también permiten que los modos extendidos realicen un cambio a la izquierda más inmediato (como LSL). Este desplazamiento
tiene un rango limitado (de 0 a 4 bits) y se aplica después de la operación de extensión. Por ejemplo, SXTB #2
significa que el signo se extiende desde la fuente de 8 bits, luego lo desplaza a la izquierda 2 bits.
Debido a que los operandos extendidos pueden tomar un turno, UXTX y, a veces , UXTW, son funcionalmente idénticos a LSL para los turnos
0-4. Estos son en realidad alias en algunos casos de esquina donde los modos extendidos están disponibles pero los modos de cambio no lo
están. Si no se especifica la cantidad de cambio, la cantidad de cambio predeterminada es
cero.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
AGREGAR X0, X1, W2, SXTW // agregar signo registro extendido de 32 bits a // registro
extendido de 64 bits
En este caso, la extensión se aplica al operando y puede tener los siguientes valores:
Instrucción Descripción
UXTB Extrae un valor de byte de un registro y cero lo extiende al tamaño del registro.
UXTH Extrae un valor de media palabra de un registro y cero lo extiende al tamaño del registro.
LSL o UXTW Extrae un valor de palabra de un registro y cero lo extiende al tamaño del registro.
sxtb Extrae un valor de byte de un registro y cero lo extiende al tamaño del registro.
SEXTO Extrae un valor de media palabra de un registro y cero lo extiende al tamaño del registro.
SXTW Extrae un valor de palabra de un registro y cero lo extiende al tamaño del registro.
• Cuando la cantidad de turno también es cero, tanto el operador como la cantidad de turno pueden ser
omitido
• Para instrucciones de registro de 64 bits, los operadores adicionales UXTX y SXTX usan los 64 bits del registro de
operandos con un desplazamiento opcional. En ese caso, ARM recomienda UXTX como operador.
• Cuando al menos un registro es SP, ARM recomienda el uso del operador LSL, en lugar de
UXTX.
• Para las instrucciones de registro de 32 bits, los operadores UXTW y SXTW usan los 32 bits del registro de
operandos con un desplazamiento opcional. Una vez más, ARM recomienda a UXTW como operador.
• Cuando un registro es WSP, ARM recomienda el uso del operador LSL, en lugar de UXTW.
En las instrucciones de registro de 64 bits, el operando de registro final se escribe como Wm para todos
excepto los operadores de extensión UXTX/LSL y SXTX.
Por ejemplo:
LDR W10, [X11, W12, SXTW] // Cargar desde una matriz usando un //índice firmado
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Nota
Los indicadores de condición (NZCV) y los códigos de condición son los mismos en A32 y T32.
norte
Negativo Establézcalo en el mismo valor que el bit [31] del resultado. Para un entero de 32 bits con
signo, el bit[31] establecido indica que el valor es negativo.
C Llevar Se establece en el valor de realización del resultado, o en el valor del último bit
desplazado de una operación de desplazamiento.
El indicador C se establece si el resultado de una operación sin firmar desborda el registro de resultados.
La bandera V opera de la misma manera que la bandera C, pero para operaciones firmadas.
Código Codificación Significado (cuando lo establece CMP) Significado (cuando lo establece FCMP) Banderas de condición
CS 0b0010 Juego de transporte (idéntico al HS). Mayor que, igual o desordenado C=1
(idéntico a HS).
SA 0b0010 Mayor que, igual a (sin Mayor que, igual o desordenado C=1
signo) (idéntico a CS). (idéntico a CS).
CC 0b0011 Llevar claro (idéntico a LO). Menor que (idéntico a LO). C=0
LO 0b0011 Sin firmar menor que (idéntico a Menor que (idéntico a CC). C=0
CC).
HOLA 0b1000 Mayor que (sin signo). Mayor que o desordenado. (C = 1) &&(Z = 0)
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
GE 0b1010 Mayor o igual que (con signo). Mayor qué o igual a. N==V
LE 0b1101 Menor o igual que (firmado). Menor que, igual o desordenado. (Z==1)
||(N!=V)
Alabama
0b1110 Siempre ejecutado. Defecto. Siempre ejecutado. Ningún
Nota
A64 añade NV (0b1111), aunque se comporta igual que su complemento, AL (0b1110). Esto es diferente en ARMv7-A
A32.
Este conjunto se proporcionó para reemplazar el uso común de la ejecución condicional en el código ARM.
Selección condicional con incremento, negación o inversión Seleccione condicionalmente entre un registro fuente
opcional y un segundo registro fuente incrementado, negado,
invertido o no modificado.
Nota
Estos son los usos más comunes de las instrucciones condicionales simples en A32 y T32. Los usos típicos incluyen
el conteo condicional o el cálculo del valor absoluto de una cantidad con signo.
Operaciones condicionales
A64 solo permite la ejecución condicional en instrucciones de bifurcación. Esto contrasta con A32 y T32, donde la mayoría de
las instrucciones se pueden usar con un código de condición. Las instrucciones A64 son:
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Por ejemplo:
• CSINC Selecciona entre dos registros, en base a una condición. Devuelve el primer registro fuente o el registro del operando
que se incrementa en uno. Esto es útil para controlar bucles de programa.
Por ejemplo:
• CSINV Selecciona entre dos registros, en base a una condición. Devolver el primer registro fuente o
el registro de operando invertido.
• CSNEG Selecciona entre dos registros, en función de una condición. Devuelve el primer registro fuente o el registro del operando
negado.
conjunto condicional
Selecciona condicionalmente entre 0 y 1 (CSET) o 0 y -1 (CSETM). Se utiliza, por ejemplo, para establecer los indicadores de
condición como un valor booleano o una máscara en un registro general.
Comparación condicional
CMP y CMN establecen los indicadores de condición en el resultado de una comparación si la condición original es verdadera. Si
no es verdadero, los indicadores condicionales se establecen en un estado de indicador de condición especificado. La instrucción
de comparación condicional es útil para expresar comparaciones anidadas o compuestas.
La selección condicional y la comparación condicional también están disponibles para registros de punto flotante mediante las
instrucciones FCSEL y FCCMP .
Por ejemplo:
Esta clase de instrucciones proporciona una forma poderosa de evitar el uso de ramas o instrucciones ejecutadas
condicionalmente. Los compiladores, o programadores ensambladores, pueden adoptar una técnica para realizar las
operaciones para ambas ramas de una instrucción if-then-else. Luego se selecciona el resultado correcto al final.
si (i == 0) r = r + 2; de lo contrario r = r - 1;
CMP W0, #0 // si (i == 0)
SUBW2, W1, #1 // r = r - 1
AGREGAR W1, W1, #2 // r = r + 2
CSEL W1, W1, W2, EQ // selecciona entre los dos resultados
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Las instrucciones de memoria pueden acceder a la memoria normal de forma no alineada. Esto no está respaldado por
accesos exclusivos, cargar adquirir o almacenar variantes de liberación. Si no se desean accesos no alineados, se pueden
configurar para fallar; sin embargo, la mayoría de los sistemas operativos reales (incluido Linux) no hacen esto. Los accesos
no alineados pueden ser útiles y muchos programas de espacio de usuario asumen que son posibles.
Para cargas en registros de enteros, puede elegir un tamaño para cargar. Por ejemplo, para cargar un tamaño más pequeño
que el valor de registro especificado, agregue uno de los siguientes sufijos a la instrucción LDR:
También hay formas de desplazamiento sin escala como LDUR<tipo>. Los programadores normalmente no tienen que usar el
formulario LDUR explícitamente, porque la mayoría de los ensambladores pueden seleccionar la versión adecuada, según el
desplazamiento utilizado.
No es necesario especificar una carga ampliada a cero en un registro X, porque al escribir en un registro W, efectivamente, el
cero se extiende a todo el ancho del registro, como se muestra en la siguiente figura:
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
firmar extender
00 00 00 00 FF FF FF 8A R4
firmar extender
FF FF FF FF FF FF FF 8A R4
Extensión cero
00 00 00 00 00 00 00 8A R4
También hay formas de compensación sin escala como STUR<tipo>. Los programadores normalmente no tienen que usar el
formulario STUR explícitamente, ya que la mayoría de los ensambladores pueden seleccionar la versión adecuada, según el
desplazamiento utilizado.
El tamaño a almacenar puede ser más pequeño que el registro. Puede especificar esto agregando una B o una H
sufijo al STR. Siempre es la parte menos significativa del registro la que se almacena en tal caso.
Las instrucciones de carga y almacenamiento también pueden acceder a registros SIMD y de coma flotante. En este
caso, el tamaño está determinado únicamente por el registro que se carga o almacena. que puede ser cualquiera de los
registros B, H, S, D o Q. Los bits de memoria leídos o escritos en cada caso se resumen en las siguientes tablas.
LDRB - 8 - - - - -
LDRH - dieciséis
- - - - -
LDRSB 8 8 - - - - -
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
LDRSW 32 - - - - - -
STRB - 8 - - - - -
STRH - dieciséis
- - - - -
No hay opciones de extensión de signo disponibles para cargas en registros FP/SIMD. Las direcciones para tales cargas
todavía se especifican utilizando los registros de propósito general.
Por ejemplo:
LDR D0, [X0, X1] // Carga el registro D0 con la palabra doble en la // dirección de
memoria a la que apunta X0 más X1.
Las cargas y almacenes SIMD escalares y de punto flotante utilizan los mismos modos de direccionamiento que las cargas y
almacenes de enteros.
Por ejemplo:
Los modos de direccionamiento disponibles para A64 son similares a los de A32 y T32. Hay algunas restricciones
adicionales y algunas características nuevas, pero los modos de direccionamiento disponibles para A64 no sorprenderán a
alguien familiarizado con A32 o T32.
En A64, el registro base de un operando de dirección siempre debe ser un registro X. Sin embargo, varias instrucciones
admiten extensión cero o extensión de signo, de modo que se puede proporcionar un desplazamiento de 32 bits como un
registro W.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Modos de compensación
Los modos de direccionamiento compensado agregan un valor inmediato o un valor de registro modificado opcionalmente a un 64-
registro base de bits para generar una dirección.
LDR X0, [X1, X2, LSL, #3] Cargar desde la dirección X1 + (X2 << 3)
LDR X0, [X1, W2, SXTW] Cargar desde dirección X1 + extensión de signo (W2)
LDR X0, [X1, W2, SXTW, #3] Carga desde la dirección X1 + (signo extendido (W2) << 3)
Tabla 12 Modos de direccionamiento de compensación
Al especificar una opción de turno o extensión, la cantidad de turno puede ser 0 (el valor predeterminado) o log2
del tamaño de acceso en bytes (de manera que Rn << <shift> multiplica Rn por el tamaño de acceso). Esto admite operaciones
comunes de indexación de matrices.
Modos de índice
Los modos de índice son similares a los modos de compensación, pero también actualizan el registro base. La sintaxis es la misma
que en A32 y T32, pero el conjunto de operaciones es más restrictivo. Por lo general, solo se pueden proporcionar compensaciones
inmediatas para los modos de índice.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
LDR X0, [X1, #8]! Preíndice: actualice X1 primero (a X1 + #8), luego cargue desde
la nueva dirección
// Ejemplo en C que muestra los accesos que es probable que genere un compilador.
mientras (c != '\0');
}
A64 tiene otro modo de direccionamiento específicamente para acceder a grupos literales. En A32 y T32, la PC se puede
leer como un registro de propósito general, por lo que se puede acceder a un grupo literal simplemente especificando PC
como el registro base.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Cargas relativas a PC
En AArch64, la PC no es accesible y se trata de manera diferente a los registros de propósito general; hay un modo de
direccionamiento especial para las instrucciones de carga que accede a una dirección relativa a la PC. Este modo de
direccionamiento de propósito especial tiene un rango mucho mayor que el que podrían lograr las cargas relativas a la PC
en A32 y T32, por lo que puede haber menos grupos literales y más espaciados. El uso de los modos relativos a la PC se
muestra en la siguiente tabla:
Nota
<label> debe tener una alineación de 4 bytes para todas las variantes.
W7 = W7 + (X0 + 4)
X8 =(X0)
X2 =(X0 + 8)
LDP X8, X2, [X0], #0x10 Carga la palabra doble en la dirección X0 en X8 y la palabra doble en la dirección
X11 + 8 en D2 y agrega 0x10 a X11.
X8 = X0
X2 = (X11 + 8)
X11 = X11 + 0x10
STP X9, X8, [X4] Almacena la palabra doble en X9 para la dirección X4 y almacena la
palabra doble en X8 para la dirección X4 + 8.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
X0 + 4 X0
4 bytes 4 bytes
63 3231 0
W7 W3
X0 + 4 X0
4 bytes 4 bytes
63 3231 0
W7 W3
Las instrucciones A64 LDTR y STTR realizan una carga o almacenamiento sin privilegios:
• Cuando se ejecutan en EL1, se comportan como si se ejecutaran en el nivel de privilegio EL0. Se pueden usar para eliminar la referencia
de los punteros que se proporcionan con las llamadas al sistema, lo que permite que el sistema operativo se asegure de que solo
se acceda a los datos accesibles para la aplicación.
Prefetch from Memory (PRFM) proporciona una pista al sistema de memoria de que el programa utilizará pronto los datos de una
dirección en particular. El efecto de esta sugerencia generalmente da como resultado que se carguen datos o instrucciones en uno
de los cachés.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Las cargas y almacenes no temporales relajan los requisitos de ordenación de la memoria. En el siguiente ejemplo, los accesos a la
memoria pueden ser observados en cualquier orden por los demás observadores dentro del dominio de compartibilidad de las direcciones
de memoria a las que se accede.
Para que un observador externo observe las cargas en orden, se debe utilizar una barrera explícita:
• Barrera de Memoria de Datos (DMB). Esto obliga a que todos los accesos a la memoria anteriores en el orden del programa se
vuelvan visibles globalmente antes de cualquier acceso posterior.
Por ejemplo:
• Barrera de sincronización de datos (DSB). Todas las cargas y almacenes pendientes, mantenimiento de caché
instrucciones, se completan antes de que continúe la ejecución del programa. Un DSB se comporta como un DMB, pero es más
restrictivo. La ejecución del código se detiene, mientras que DMB solo detiene el acceso a la memoria.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
ARMv8-A introduce barreras unilaterales, que están asociadas con el modelo de consistencia de lanzamiento.
Se denominan instrucciones Load-Acquire (LDAR) y Store-Release (STLR) y son primitivas de sincronización basadas en direcciones. Solo
se admite el direccionamiento de registro base para estas instrucciones, no se proporcionan compensaciones ni otros tipos de
direccionamiento indexado.
La instrucción LDXR carga un valor de una dirección de memoria e intenta reclamar un bloqueo exclusivo en la dirección. La instrucción
Store-Exclusive luego escribe un nuevo valor en esa ubicación, pero solo si el bloqueo se obtuvo y retuvo con éxito.
El emparejamiento LDXR/STXR se utiliza para construir primitivas de sincronización estándar, como spinlocks. Se proporciona un conjunto
emparejado de instrucciones LDXRP y STXRP para permitir que el código actualice atómicamente una ubicación que abarca dos registros.
Las opciones de byte, media palabra, palabra y doble palabra están disponibles. Al igual que el emparejamiento Load Acquire/Store
Release, solo se admite el direccionamiento de registro base, sin compensaciones.
En hardware, el núcleo incluye un dispositivo que se denomina monitor local. Este monitor observa el bus de direcciones. Cuando el núcleo
realiza un acceso de carga exclusivo, registra ese hecho. Cuando realiza un almacenamiento exclusivo, comprueba que se realizó una
carga exclusiva anterior y, de no ser así, falla el almacenamiento exclusivo. La arquitectura permite que las implementaciones individuales
determinen el nivel de verificación realizado por el monitor, como se muestra en la siguiente figura:
Abierto Exclusivo
STXRPASS o CLREX
O STXR a la ubicación
monitoreada por otro hilo
La instrucción CLREX borra los monitores, pero a diferencia de ARMv7-A, la entrada o retorno de excepción también hace lo mismo. El
monitor también se puede borrar por error, por ejemplo, por desalojos de caché u otras razones que no están directamente relacionadas
con la aplicación. El software debe evitar tener accesos explícitos a la memoria, actualizaciones de registros de control del sistema o
instrucciones de mantenimiento de caché entre instrucciones LDXR y STXR emparejadas .
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
4 Control de flujo
Las instrucciones A64 generalmente proporcionan compensaciones más largas, tanto para bifurcaciones relativas a PC como para direccionamiento de
compensaciones.
El rango de ramificación aumentado facilita la gestión de los saltos de intersección. El código generado dinámicamente se
coloca en el montón para que, en la práctica, se pueda ubicar en cualquier lugar. Es mucho más fácil para el sistema de
tiempo de ejecución administrar los saltos de intersección con menos requisitos para insertar carillas (código adicional para
restablecer el contador del programa).
La necesidad de grupos literales (bloques de datos que están incrustados en el flujo de código) ha sido durante mucho
tiempo una característica de los conjuntos de instrucciones ARM. Esto todavía existe en A64. Sin embargo, el mayor
desplazamiento de carga relativo a la PC ayuda considerablemente con la administración de grupos literales, lo que hace
posible usar uno por unidad de compilación. Esto elimina la necesidad de fabricar ubicaciones para múltiples grupos en código largo
secuencias.
El conjunto de instrucciones A64 proporciona varios tipos de instrucciones de bifurcación, como se muestra en la siguiente
tabla. Para bifurcaciones relativas simples, es decir, aquellas a un desplazamiento de la dirección actual, se usa la
instrucción B.
Las bifurcaciones relativas simples incondicionales pueden bifurcarse hacia atrás o hacia adelante hasta 128 MB desde
la ubicación actual del contador del programa. Las ramas relativas simples condicionales, donde se agrega un código de
condición a la B, tienen un rango más pequeño de ± 1 MB.
Las llamadas a subrutinas, donde la dirección de retorno debe almacenarse en el registro de enlace (X30), usan la
instrucción BL . Esto no tiene una versión condicional. BL se comporta como una instrucción B con el efecto adicional de
almacenar la dirección de retorno, que es la dirección de la instrucción después de BL, en el registro X30.
Además de estas instrucciones relativas a PC, A64 incluye dos ramas absolutas. El BR Xn
La instrucción realiza una bifurcación absoluta a la dirección en Xn mientras que BLR Xn tiene el mismo efecto, pero también
almacena la dirección de retorno en X30 (el registro de enlace). La instrucción RET se comporta como BR Xn, pero sugiere a
la lógica de predicción de bifurcación que es un retorno de función. RET se bifurca a la dirección en X30 de forma
predeterminada, aunque se pueden especificar otros registros.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Instrucciones de rama
B (desplazamiento) Programa rama relativa adelante o atrás 128 MB. Una versión condicional, por ejemplo B.EQ, tiene un rango de 1 MB.
BL (compensación) Como B , pero almacene la dirección de retorno en X30 e insinúe a la lógica de predicción bifurcada que esto
es una llamada de función.
BLR Xn Como BR , pero almacena la dirección de retorno en X30 y sugiere a la lógica de predicción de bifurcación que se
trata de una llamada de función.
RET{Xn} Como BR, pero sugiera a la lógica de predicción de bifurcación que se trata de un retorno de función. Vuelve a la dirección
en X30 por defecto, pero se puede especificar un registro diferente.
B.cond Rama condicional hacia adelante o hacia atrás. Por ejemplo B.EQ, tiene un rango de 1 MB. La rama solo se toma si la
condición es verdadera (para el valor actual de NZCV).
A64 incluye algunas ramas condicionales especiales. Estos permiten una densidad de código mejorada porque no es necesaria una
comparación explícita.
Ambas instrucciones comparan el registro fuente, ya sea de 32 bits o de 64 bits, con cero y luego realizan una bifurcación condicional. El
desplazamiento de rama tiene un rango de ± 1 MB. Estas instrucciones no leen ni escriben los indicadores de código de condición (NZCV).
Estas instrucciones prueban el bit en el registro de origen en la posición de bit especificada por el valor del bit y se bifurcan
condicionalmente dependiendo de si el bit está establecido o borrado. El desplazamiento de rama tiene un rango de ±32kB. Al igual que con
CBZ y CBNZ, no leen ni escriben los indicadores de código de condición.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
• Manejo de excepciones.
• Depuración.
HVC #imm16 // Llamada de hipervisor, permite que el código del sistema operativo llame al
// hipervisor (EL2).
Cuando la excepción generada se toma en AArch64, el valor #imm16 (inmediato) se pone a disposición del controlador en el
Registro de Síndrome de Excepción.
MRS Xt, <registro del sistema> // Esto copia un registro del sistema en un // registro
de propósito general
Por ejemplo
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
MSR <registro del sistema>, Xt // Esto copia un registro de propósito general // en un registro
del sistema
Por ejemplo
También se puede acceder a campos individuales de PSTATE con MSR o MRS. Por ejemplo, para seleccionar
el puntero de pila asociado con EL0 o el nivel de Excepción actual:
Hay formas especiales de estas instrucciones que se pueden usar para borrar o establecer bits de máscara de excepción
individuales.
HLT #imm16 // #imm es ignorado por el hardware ARM pero // puede usarse
para almacenar información sobre // el punto de interrupción para
un depurador
Las instrucciones HINT pueden tratarse legalmente como NOP, pero pueden tener efectos específicos de implementación.
PISTA #imm
Dónde:
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
#imm es un valor inmediato sin signo de 7 bits que identifica el tipo de instrucción, como se muestra en la siguiente tabla:
1 RENDIR Sugerencia de que el subproceso actual está realizando una tarea que se puede intercambiar
• Las instrucciones AArch64 SIMD (NEON) no tienen el prefijo V presente en AArch32 NEON
instrucciones.
• Hay soporte para punto flotante de doble precisión, lo que permite que el código C use doble precisión
punto flotante para ser vectorizado.
Están ahora:
• Instrucciones para operar sobre datos escalares que se almacenan en registros NEON.
• Instrucciones de carril cruzado para la reducción de vectores, la suma y la toma del mínimo o máximo
valor.
• Instrucciones para realizar acciones como comparar, sumar, encontrar un valor absoluto y negar, para
operar en elementos enteros de 64 bits.
• Las comparaciones de punto flotante establecen los indicadores de condición (NZCV) directamente. En A64, no hay necesidad de
transfiera explícitamente los resultados de la comparación de banderas de punto flotante a enteros.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
• Instrucciones relacionadas con el estándar IEEE754-2008, por ejemplo para calcular el mínimo y
máximo de un par de números.
• Se puede especificar explícitamente un modo de redondeo al convertir formatos de números enteros a puntos flotantes. Ya
no es necesario configurar las banderas FPCR globales cuando se requieren conversiones simples en un modo de
redondeo particular. Algunas de estas opciones también están disponibles para ARMv8-A A32 y T32.
• Instrucciones para admitir conversiones entre enteros de 64 bits y formatos de coma flotante.
• En A64, las operaciones de coma flotante que implican tipos de enteros funcionan directamente en registros de enteros.
No es necesario transferir valores enteros manualmente entre registros de punto flotante y enteros para operaciones
de conversión.
Hay dos aspectos para proporcionar seguridad en un sistema o dispositivo informático moderno:
1. Reforzar un dispositivo informático para evitar el acceso no autorizado a datos o recursos informáticos de
el sistema.
2. Garantizar que los datos o la información que se envía a través de una red permanezcan protegidos en tránsito y solo sean
accesibles para su destino previsto.
La tecnología ARM TrustZone proporciona mecanismos de hardware para garantizar la seguridad a nivel de nodo.
Se han definido varios protocolos y algoritmos en el software para proteger la información y evitar el acceso no autorizado
a los datos confidenciales. La criptografía es la ciencia específica de proteger la información y los algoritmos criptográficos se
utilizan ampliamente en los protocolos de seguridad.
Intercambio de llaves El mecanismo de intercambio de claves define cómo se pueden intercambiar las claves
utilizadas para cifrar y descifrar datos.
autenticación de entidad La autenticación de entidad ayuda a afirmar la identidad de las dos partes que se
comunican
Transferencia de mensajes Esta es la fase en la que los datos reales se cifran y transfieren a través del canal de
comunicación.
Los algoritmos de cifrado de bloques simétricos como AES se utilizan para el cifrado de datos durante la fase de transferencia de
mensajes y los algoritmos hash como SHA se utilizan para la autenticación de mensajes.
Las instrucciones criptográficas son una extensión opcional para ARMv8-A. Estas instrucciones criptográficas son funciones
de "ayuda" que requieren software para garantizar que lleven a cabo la operación completa.
Mejoran significativamente el rendimiento en tareas como el cifrado AES y el hash SHA1 y SHA256.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.
Otro aspecto importante de la seguridad es asegurarse de que está ejecutando el código correcto. Para ello,
Trustzone proporciona un arranque seguro. Se establece una cadena de confianza, comenzando con hardware de
confianza implícita.
Cada etapa del arranque utiliza las funciones auxiliares criptográficas para autenticar la siguiente etapa antes de
ejecutar el código. Los proveedores de confianza firman cualquier actualización de código y las instrucciones
criptográficas también se utilizan para mejorar el rendimiento al verificar estas firmas.
Copyright © 2017 ARM Limited o sus afiliados. Reservados todos los derechos.