Introducción al conjunto de instrucciones ARM

Introducción a las instrucciones ARM

El conjunto de instrucciones ARM es una instrucción diseñada para la arquitectura ARM. En la primera etapa del arranque de BootLoader y la primera etapa del núcleo, habrá un archivo escrito en lenguaje ensamblador, y también hay un código de ensamblaje utilizado para inicializar el entorno de la placa de desarrollo en la placa sin ejecutar el sistema operativo. Entonces, ya sea que esté desarrollando una placa con un sistema operativo o un desarrollo de placa desnuda, el lenguaje ensamblador es muy necesario para aprender un poco, al menos para comprender algunas instrucciones de ensamblaje comúnmente utilizadas. Para diseñar un sistema con un rendimiento superior, se debe dominar el principio de funcionamiento de ARM.

El conjunto de instrucciones ARM se puede dividir en los siguientes seis

  • Instrucción de salto
  • Instrucciones de procesamiento de datos
  • Instrucción de transferencia de registro de estado del programa
  • Instrucción de carga / almacenamiento
  • Instrucción coprocesador
  • Instrucción de interrupción anormal

La sintaxis típica de la instrucción arm es: <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>

  • <opcode>: instrucción mnemónica, como ADD, SUB y otras instrucciones.
  • {<segundo>}: indica ejecución condicional 1 .
  • {S}: Determine si la operación de la instrucción afecta el valor de CPSR.
  • <Rd>: registro de destino.
  • <Rn>: indica el registro que contiene el primer operando.
  • <shifter_operand>: indica el segundo operando.

Modo de direccionamiento de instrucciones ARM

El direccionamiento de instrucciones ARM se refiere a encontrar la dirección de un operando. Los métodos de direccionamiento se pueden dividir en:

  • El modo de direccionamiento del operando de la instrucción de procesamiento de datos.
  • Modo de direccionamiento de instrucciones de carga / almacenamiento.

Direccionamiento operando de instrucciones de procesamiento de datos

Los operandos de estas instrucciones tienen tres formatos: número inmediato 2 , modo de registro (el operando es el valor del registro) y modo de cambio de registro (el operando es el cambio correspondiente en el valor en el registro). Modo de cambio de registro 3 : ASR (desplazamiento aritmético a la derecha), LSL (desplazamiento lógico a la izquierda), LSR (desplazamiento lógico a la derecha), ROR (desplazamiento cíclico a la derecha), RRX (desplazamiento cíclico a la derecha con extensión), bits desplazados El número puede expresarse como un valor inmediato o como un registro. Por lo tanto, hay 11 tipos de modos de direccionamiento para instrucciones de procesamiento de datos.

  • # <inmediato>
  • <Rm>
  • <Rm>, LSL, # <shirt_imm>
  • <Rm>, LSL, # <Rs>
  • <Rm>, LSR, # <shirt_imm>
  • <Rm>, LSR, # <Rs>
  • <Rm>, ASR, # <shirt_imm>
  • <Rm>, ASR, # <Rs>
  • <Rm>, ROR, # <shirt_imm>
  • <Rm>, ROR, # <Rs>
  • <Rm>, RRX

cargar / almacenar direccionamiento de operando

Direccionamiento de instrucciones de carga / almacenamiento de bytes y palabras sin signo

El modo de direccionamiento de la instrucción de carga / almacenamiento consta de dos partes. Una parte es un registro de dirección base, y la otra parte es un desplazamiento de dirección. Hay tres formatos para el desplazamiento de dirección: inmediato, registro y cambio de registro . Hay tres tipos de métodos de cálculo de direcciones en el mismo modo de direccionamiento: desplazamiento normal, método previo a la actualización y método posterior a la actualización.

  • El método de desplazamiento común es sumar y restar directamente el valor en el registro de dirección base y el desplazamiento, que se expresa como [<Rn>, desplazamiento de dirección].
  • método de pre-actualización para la actualización reutilización, expresada como [<rn>, la dirección de desplazamiento] ! , uso! Indica el método de actualización por adelantado.
  • Método de actualización posterior al evento: utilice el valor en el registro de la dirección base y luego actualice, expresado como [<Rn>] , desplazamiento de la dirección , seguido de [], seguido del desplazamiento de la dirección que indica la actualización posterior al evento.
    Por lo tanto, se pueden combinar 9 modos de direccionamiento:
  • [<Rn>, # + / - <offset_12>]
  • [<Rn>, + / - <Rm>]
  • [<Rn>, + / - <Rm>, <shift> # <shift_imm>]
  • [<Rn>, # + / - <offset_12>] !
  • [<Rn>, + / - <Rm>] !
  • [<Rn>, + / - <Rm>, <shift> # <shift_imm>] !
  • [<Rn>] , # + / - <offset_12>
  • [<Rn>] , + / - <Rm>
  • [<Rn>] , + / - <Rm>, <shift> # <shift_imm> El
    método previo a la actualización y el método posterior a la actualización hacen referencia al proceso de procesamiento del valor y el valor de desplazamiento en el registro de la dirección base primero, y luego Uso El registro de la dirección base se actualiza después de usar el valor en el registro de la dirección base. Similar a ++ val y val ++ en lenguaje C.

Modo de direccionamiento de carga masiva / almacenamiento

Cuando necesite cargar o almacenar una gran cantidad de datos, puede usar la operación de carga masiva / instrucción de almacenamiento. Una instrucción por lotes puede transferir datos entre un conjunto de registros y una unidad de memoria continua. Transfiera hasta 16 datos de la unidad de memoria a la vez. La correspondencia entre el registro y la unidad de memoria en la instrucción es que el registro con el número más bajo corresponde a la unidad de dirección más baja en la memoria.
El formato es: LDM | STM {<cond>} <addressing_mode> <Rn> {!}, <Registers> {^} <addressing_code> indica cómo cambia la dirección, existen los siguientes cuatro tipos:

  • IA (incremento después): incremental después. El primer registro corresponde a la unidad de memoria como la memoria de la unidad señalada por el registro base <Rn>. Luego agregue 4 bytes en secuencia
  • IB (Increment Before): aumento por adelantado. El primer registro corresponde a la unidad de memoria donde la unidad de memoria es el registro de dirección base <Rn> + 4. Luego agregue 4 bytes en secuencia
  • DA (Decremento después): Disminución después. El primer registro corresponde a la unidad de memoria es la memoria de la unidad indicada por el registro de dirección base <Rn> -4 * (número total de registros -1). Luego agregue 4 bytes en secuencia
  • DB (Decremento anterior): disminución por adelantado. El primer registro corresponde a la unidad de memoria cuya unidad de memoria es el registro de dirección base <Rn> -4 * (número total de registros). Luego agregue 4 bytes en secuencia

Para la transmisión de datos normal, la instrucción de carga y la instrucción de almacenamiento pueden usar el mismo modo de direccionamiento. Sin embargo, para el funcionamiento de la pila de datos, el orden en que los datos se escriben y se leen de la memoria es diferente, por lo que los métodos de direccionamiento utilizados también son diferentes. Los modos de direccionamiento de la pila son: FD, ED, FA, EA 4 .

Modo de direccionamiento de instrucciones de carga / almacenamiento misceláneo

Las instrucciones varias incluyen instrucciones de carga / almacenamiento con operandos de media palabra, bytes firmados y bytes dobles. El formato de sintaxis es:
LDR | STR {<cond>} H | SH | SB | D <Rd>, <addressing_mode>

  • H: Entrevista de media palabra.
  • S: Datos del personaje.
  • B: acceso a datos de bytes.
  • W: acceso de doble palabra.
    Solo hay 6 tipos de métodos de direccionamiento: los métodos de direccionamiento incluyen desplazamiento ordinario, método previo a la actualización y método posterior a la actualización . El formato del desplazamiento es: valor inmediato, registro . Entonces combine 6 modos de direccionamiento:
  • [<Rn>, # + / - <offset_8>]
  • [<Rn>, + / - <Rm>]
  • [<Rn>, # + / - <offset_8>] !
  • [<Rn>, + / - <Rm>] !
  • [<Rn>] , # + / - <desplazamiento_8>
  • [<Rn>] , + / - <Rm>

Conjunto de instrucciones ARM

Instrucción de salto

Hay dos formas de lograr saltos de programa en ARM: use las instrucciones de salto y escriba el valor de la dirección de destino directamente en la PC . La diferencia entre los dos es que el registro de la PC se opera directamente, y cualquier salto (salto de longitud) se puede lograr en el espacio de direcciones de 4GB. La instrucción de salto de ARM puede saltar hacia adelante o hacia atrás desde la instrucción actual al espacio de direcciones de 32 MB. Las instrucciones son B, BL, BLX, BX L. Guarde el valor de la PC en el registro LR, X salte con el cambio de estado (puede cambiar al conjunto de instrucciones del pulgar, el tipo de instrucción en la dirección de destino está determinado por el bit [0] de la dirección de destino )

Instrucciones de procesamiento de datos

Las instrucciones de procesamiento de datos se pueden dividir en tres categorías: instrucciones de transferencia de datos, instrucciones de operación de lógica aritmética e instrucciones de comparación. Para el método de cálculo de operandos, consulte la parte del modo de direccionamiento de las instrucciones de procesamiento de datos mencionadas anteriormente. La instrucción de lógica aritmética almacenará el resultado en el registro de destino y actualizará el bit de bandera de ajuste de precio en el CPSR. La instrucción de comparación no guarda el resultado de la operación, sino que solo actualiza el indicador de condición correspondiente en el CPSR.

  • Las instrucciones de transmisión de datos son: MOV MVN
    MOV | MVN {<cond>} {s} <Rd>, <shifter-operand> La
    instrucción MOV (MVN) es transferir los datos (código inverso) representados por <shifter_operand> al registro de destino Rd> Medio.
    nota: MOVS PC, la instrucción LR puede realizar el retorno de alguna interrupción anormal. La PC es el registro de destino y se establece el bit S. Cuando se ejecuta la instrucción, el valor del SPSR correspondiente al modo de procesador actual se copia al CPSR.

  • Las instrucciones de comparación son: CMP CMN TST TEQ
    <opcode> {<cond>} <Rn>, <shifter_operand> La
    instrucción CMP es actualizar el indicador de condición correspondiente en el CPSR de acuerdo con el valor de <Rn> - <shifet_operand> Bit
    La instrucción CMN es actualizar el valor de <Rn> + <shifet_operand> y el bit de indicador de condición correspondiente en CPSR de acuerdo con el resultado de la operación.
    La instrucción TST es realizar una operación AND a nivel de bit en el valor en <Rn> y el valor de <shifet_operand>, y actualizar el bit de indicador de condición correspondiente en CPSR de acuerdo con el resultado de la operación.
    La instrucción TEQ es realizar una operación XOR a nivel de bit entre el valor en <Rn> y el valor de <shifet_operand>, y actualizar el bit de indicador de condición correspondiente en el CPSR de acuerdo con el resultado de la operación.

  • Las instrucciones de lógica aritmética son AGREGAR SUB RSB ADC SBC RSC Y BIC EOR ORR
    <opcode> {<cond>} {s} <Rd>, <Rn>, <shifter_operand>

ADD agrega el operando al valor en el registro <Rn> y guarda el resultado en el registro de destino.
El ADC tiene una instrucción de adición de bits y agrega el valor del bit de indicador de condición C en CPSR sobre la base de ADD.
por ejemplo: Agregar operandos de 64 bits. Un operando de origen de 64 bits se coloca en R0 y R1, un operando de origen de 33 bits inferior se coloca en R0, un operando de origen de 64 bits también se coloca en R2 y R3, y un
ADDS inferior de 32 bits se almacena en R2 R4, R0, R2
ADC R5, R1, R3 ==> R5R4 es el resultado calculado
SUB, la instrucción de sustracción SUC y la instrucción de sustracción de bits. SUC resta el inverso del indicador de condición C en CPSR sobre la base de SUB. La combinación de estas dos instrucciones también puede realizar una resta de 64 bits.
SUBS R4, R0, R2
SUC R5, R1, R3
RSB, instrucción de sustracción inversa RSC e instrucción de sustracción inversa bit a bit. <Rd> = <shifter_operand> - <Rn>

Instrucciones de multiplicación: (no se usa mucho para esto)

  • MUL: instrucción de multiplicación de 32 bits.
  • MLA: instrucción de multiplicación de 32 bits con suma.
  • SMULL: instrucción de multiplicación de números con signo de 64 bits.
  • SMLAL: instrucción de multiplicación con signo de 64 bits con suma.
  • UMULL: instrucción de multiplicación sin signo de 64 bits.
  • UMLAL: instrucción de multiplicación sin signo de 64 bits con suma.

CLZ {<segundo>} <Rd>, <Rm>. La instrucción se utiliza para contar el número de 0 en el extremo más alto del operando en el registro.
La operación de división en el conjunto de instrucciones ARM es implementada por un coprocesador, por lo que no hay instrucción aritmética de división.

AND, ORR, EOR y BIC son lógicamente bit AND, OR, XOR y operaciones claras, respectivamente.

Instrucción de transferencia de registro de estado del programa

Hay dos instrucciones en ARM para transferir datos entre el registro de estado y el registro general. El programa no puede cambiar directamente el estado del programa al estado del pulgar modificando directamente el bit de control T en el CPSR. El estado del programa debe cambiarse a través de instrucciones como BX. Normalmente, la modificación del registro de estado del programa se realiza mediante "lectura-> modificación-> escritura".

  • Transfiera las instrucciones del registro general de MSR al registro de estado. Eso esta escrito.
  • Transfiera las instrucciones del registro de estado de MRS al registro general. Leer

Instrucción de carga / almacenamiento

La instrucción de carga se usa para leer datos de la memoria en el registro, y la instrucción de almacenamiento se usa para guardar los datos en el registro en la memoria.
Cargar / Almacenar
Para grandes cantidades de datos movidos, ARM también proporciona instrucciones de acceso a la memoria de carga / almacenamiento masivo. La instrucción de carga por lotes puede leer datos de celdas de memoria consecutivas a la vez y transferirlos a registros. La instrucción de almacenamiento por lotes es escribir los valores de registro múltiples en la lista de registros en la memoria por el sexo opuesto.

LDM | STM {<cond>} <addressing_mode> Rn {!}, <Registers> {^}
** en el comando! ** Después de ejecutar la instrucción, la dirección de memoria del operando se escribirá en el registro de dirección base <Rn>, es decir, la dirección base se actualizará.
^ Significa que el valor de SPSR en el modo de procesador actual se copia en el CPSR cuando se ejecuta la instrucción. Cuando la PC no está incluida en el registro, el registro utilizado en las instrucciones de instrucción es un registro en el modo de usuario.

Hay una instrucción especial en la instrucción de transferencia de datos. El requisito de operación para el semáforo es una operación atómica (no se puede interrumpir, es decir, solo hay una instrucción). La instrucción SWP se utiliza para operaciones de semáforo cuando termina de leer y modificar registros.
swp {<cond>} <Rd>, <Rm>, [<Rn>] El resultado de la ejecución es leer el contenido de Rn en Rd, y ​​escribir el contenido del registro Rm en Rn al mismo tiempo.

Instrucción coprocesador

Las instrucciones del coprocesador ARM incluyen las siguientes tres categorías:

  • Se utiliza para la operación de procesamiento de datos del procesador ARM para inicializar el coprocesador ARM. CDP
  • Se utiliza para operaciones de transferencia de datos entre registros del procesador ARM y registros del coprocesador ARM. MCR, MRC
  • Se utiliza para transferir datos entre registros y unidades de memoria del coprocesador ARM. LDC, STC

Instrucciones de funcionamiento del coprocesador CDP. La instrucción CDP permite que el procesador ARM notifique al coprocesador ARM para que realice una operación específica, que el coprocesador completa.
Inserte la descripción de la imagen aquí
La instrucción LDC lee datos de unidades de memoria consecutivas en los registros del coprocesador. La instrucción STC escribe los datos en los registros del coprocesador en una serie de celdas de memoria.
Formato:
LDC {<cond>} {L} <coproc>, <CRd>, <addressing_mode>
LDC2 {L} <coproc>, <CRd>, <addressing_mode>

STC {<cond>} {L} <coproc>, <CRd>, <direccionamiento_modo>
STC2 {L} <coproc>, <CRd>, <direccionamiento_modo>

La instrucción MCR transfiere los datos en el registro del procesador ARM al registro del coprocesador, mientras que el MRC transfiere el valor en el registro del coprocesador al registro del procesador ARM.
MCR {<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm> {, <opcode2>}
MCR2 <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm > {, <opcode2>}

MRC {<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm> {, <opcode2>}
MRC2 <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm > {, <opcode2>}

<Rd>: registro ARM, su valor se transferirá al registro de la herramienta de filo auxiliar o leerá el valor del registro de procesamiento auxiliar.
<CRn>: Para ayudar al procesador a registrarse
<CRm>: Para el registro de destino adicional o el registro de operando de origen.

Instrucción de generación de interrupción anormal

En la descripción general de ARM, sabemos que ARM tiene 7 modos, que se pueden dividir en modo de usuario y modo privilegiado. En modo privilegiado, puede acceder a todos los recursos del sistema y cambiar a otros modos a voluntad. Pero en el modo de usuario, la autoridad no es tan grande, entonces, ¿qué hacer si desea acceder a los recursos del sistema en modo de usuario? ARM proporciona una instrucción de interrupción anormal SWI , a través de una interrupción suave para realizar la llamada al programa de modo privilegiado en el sistema operativo en modo de usuario.
SWI {<cond>} <immed_24> El sistema operativo distingue el tipo de servicio solicitado por el programa de usuario a través de un valor inmediato de 24 bits.


  1. Los códigos de condición de ejecución de instrucciones en ARM son los siguientes:
    Código de condición de instrucción ↩︎

  2. Los datos inmediatos son de 32 bits, pero no todos los operandos son datos inmediatos. Número inmediato = datos de 8 bits >> Número par (hasta 30 bits de desplazamiento, algunos lugares dicen 32 bits, el desplazamiento a la derecha 32 bits en realidad no es desplazamiento), la composición del número inmediato es el método que utiliza el menor desplazamiento, por lo que Si el ancho de los datos excede los 8 bits, definitivamente no es inmediato. Use la marca # para datos inmediatos en el conjunto de instrucciones ARM . ↩︎

  3. El desplazamiento aritmético a la derecha es el bit de signo, es decir, el valor del bit más alto está reservado; el desplazamiento lógico a la derecha es llenar el bit de la izquierda con 0; el desplazamiento circular a la derecha es llenar el bit de la izquierda con el bit desplazado a la derecha; el desplazamiento circular a la derecha con extensión El bit más significativo se llena con bits C en CPSR. ↩︎

  4. F (lleno), E (vacío): cuando el puntero de la pila apunta al elemento superior de la pila (los últimos datos introducidos en la pila), se llama pila completa, y cuando el puntero de la pila apunta a una unidad de datos disponible adyacente al elemento superior de la pila, se llama pila vacía. D (descendente): la pila de datos crece en la dirección de las direcciones de memoria decrecientes, y la pila de datos A (ascendente) crece en la dirección de las direcciones de memoria crecientes. ↩︎

Publicado 35 artículos originales · Me gusta1 · Visitas 1870

Supongo que te gusta

Origin blog.csdn.net/lzj_linux188/article/details/103523087
Recomendado
Clasificación