Características del ensamblador ARM:

Características del ensamblador ARM:

l Todo el procesamiento aritmético tiene lugar en registros generales (generalmente R0 ~ R14). El procesamiento de todos los espacios de memoria (como la esencia de las variables del lenguaje C es unos pocos BYTE en un espacio de memoria). Todos los valores se transfieren Vaya al registro de propósito general para completar, por lo tanto, se ve una gran cantidad de instrucciones LDR y STR en el código para transferir valores.

l Declaraciones de ensamblaje ARM. La instrucción actual a menudo usa el resultado de ejecución de la oración anterior implícitamente. Y el resultado de ejecución de la oración anterior se coloca en el registro CPSR (por ejemplo, carry, 0, negativo ...)

CMP R0, R1

BNE NoMatch

Por ejemplo, en la oración anterior, BNE usa implícitamente el resultado de la última ejecución de CMP. El sufijo NE indica el uso de la bandera Z. La combinación de las dos oraciones significa que si los valores de R0 y R1 no son iguales, salte a NoMatch para ejecutar.

Tenga en cuenta que PC = R15, CPSR = R16,

    Las pseudoinstrucciones ARM no son necesarias, pero una ausencia total de pseudoinstrucciones es casi difícil de escribir.

n Por ejemplo, un programa contiene al menos READONLY AREA y ENTRY, de lo contrario, la CPU no puede saber dónde comenzar a ejecutarse

l ARM pertenece a RISC, y no hay muchas instrucciones, pero puede tener el sufijo para indicar diferentes usos, que es completamente diferente del ensamblado X86.

n Si BNE es en realidad una variante de la instrucción B, es esencialmente el mismo tipo de instrucción. Es solo un juicio más sobre el indicador Z de CPSR.

ARM instrucciones de uso común, pseudo instrucciones

No hay demasiadas instrucciones comunes para ARM, por lo que no es demasiado difícil leer el código de ensamblaje de ARM. Las siguientes son las instrucciones y pseudoinstrucciones más utilizadas, no un libro de texto completo. Para obtener instrucciones detalladas, consulte Recursos.

l B, BL

l MOV, MVN

l LDR, STR

l AGREGAR, SUB, ADC, SBC, MUL

l AND, ORR, XOR, TST, BIC

l CMP

l LDM / STM

la nop

1. Declaración de salto B, BL

      Salto del flujo del programa, hay dos formas de realizar la instrucción de salto del flujo del programa en el programa ARM

l Utilice la instrucción especial de salto B

l Escriba el valor de la dirección de salto directamente en la PC del contador del programa

n Esto es casi cualquier tipo de máquina esencial de CPU, la PC indica la posición de ejecución actual de la CPU, cambiar el valor de la PC es equivalente a implementar el salto de programa

n Si implementa una declaración de devolución similar al lenguaje C, usa MOV PC, LR

n Aquí puedes saltar en cualquier espacio 4G

 

La instrucción B (Rama) indica un salto incondicional.

   B principal  ; salta al código etiquetado como principal

 

La instrucción BL (Branch with Link) indica un salto con un valor de retorno.

   BL es un paso más que B. Antes del salto, BL guardará la posición actual en R14 (es decir, el registro LR). Cuando finaliza el código de salto, use MOV PC, instrucción LR para saltar hacia atrás, esta es realmente la función de ejecución del lenguaje C Uso,

   En el ensamblaje, las subrutinas son todas BL. Después de ejecutar las subfunciones, puede usar MOV PC y LR para retroceder.

   Retraso BL  ; ejecutar subfunción o retraso de segmento de código, el retraso puede ser función C.

 

A diferencia de MOV PC, XXX puede saltar en el espacio 4G, la instrucción B solo puede saltar en el espacio de 32M (porque el desplazamiento es un valor de 26 bits con signo = 32M)

2. Transferencia de instrucciones de datos MOV, MVN

n La instrucción MOV (MOVE) puede completarse desde otro registro, registro desplazado o cargar un valor inmediato al registro de destino

MOV R0, R1  ; transfiere el valor de R1 a R0

MOV R3, # 3  ; Pase la constante 3 a R3, use MO para representar la constante, este valor no puede exceder

n MVN (MOVE Negative) se invierte y luego pasa el valor, que es un paso más que MOV

MVN R0, # 0  ; Invertir 0 (es decir, -1) a R0

MVN R1, R2   ; invierta el valor de R2 y páselo a R1

3. Instrucciones de carga / almacenamiento, LDR, STR

n LDR, STR se utilizan para intercambiar instrucciones de datos entre registros y memoria externa, prestar atención a la diferencia con MOV e intercambiar registros o constantes más adelante.

u LDR / STR puede usar una variedad de métodos de direccionamiento, el siguiente solo cita el uso más frecuente

n LDR (carga) se utiliza para cargar datos de 32 bits de WORD desde el espacio de almacenamiento externo en el registro

LDR R0, [R1] ; El valor de R1 se usa como una dirección y luego carga los datos de esta dirección a R0 (R0 = * R1)

LDR R1, = 0x30008000  ; Cargue el valor de la dirección 0x30008000 en R1. Use constantes en LDR para comenzar con =. (Tenga en cuenta que la diferencia con MOV, MOV es #)

ldr r0, = (0 << 13) | (0 << 12) | (0 << 10) | (0 << 9) | (0 << 8) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 1) | (1 << 0)

Asignación con bit a bit Y

n STR (Store) se usa para almacenar el valor de un registro en un espacio de almacenamiento externo, que es la operación inversa de LDR.

STR R0, [R1]  ; Almacene el valor de R0 en el espacio de direcciones correspondiente a R1 (* R1 = R0)

STR R0, = 0x30008000  ; almacena el valor de R0 para abordar 0x30008000

El espacio de registro de control de los módulos que no sean el núcleo de la CPU en el S2C2440 también es un espacio externo, por lo que también debe usar el siguiente comando LDR R0, = GPFDAT

4. Instrucciones de operación aritmética, ADD / ADC, SUB / SBC, MUL

n AGREGAR instrucciones de adición

AGREGAR R0, R1, R2 ; R0 = R1 + R2

AGREGAR R0, R1, # 3  ; R0 = R1 + 3

n ADC lleva instrucciones de adición de acarreo, es decir, además de sumar dos números, el valor C de CPSR también debe incorporarse

Usualmente se usa para agregar números grandes (más de 32 bits enteros). En este momento, ADD solo no se puede procesar, y se debe doblar en dos pasos, uno de los cuales usa ADC.

La siguiente es la adición de 64 bits

ADDS R0, R1, R2 ; R0 = R1 + R2, S en ADDS significa escribir el resultado de acarreo en CPSR

ADC R5, R3, R4  ; R5 = R3 + R4 + C

n instrucción de resta SUB

SUB R0, R1, R2 ; R0 = R1-R2

SUB R0, R1, # 3  ; R0 = R1-3

n SBC carry carry restar instrucciones, es decir, además de sumar dos números, el valor C de CPSR también debe ser introducido, similar a ADC

La siguiente es la resta de 64 bits

SUBS R0, R1, R2 ; R0 = R1-R2, S en SUBS significa escribir el resultado de acarreo en CPSR

SBC R5, R3, R4  ; R5 = R3-R4-C

n instrucción de multiplicación MUL

MUL R0, R1, R2 ; R0 = R1 * R2

MUL R0, R1, # 3  ; R0 = R1 * 3

5. Instrucciones de manipulación de bits AND, ORR, TST, BIC

n AND bit e instrucción

Y R0, R1, R2 ; R0 = R1 y R2

Y R0, R1, # 0xFF  ; R0 = R1 y 0xFF

n ORR bit o instrucción

ORR R0, R1, R2 ; R0 = R1 | R2

ORR R0, R1, # 0xFF  ; R0 = R1 | 0xFF

n TST prueba si un cierto bit es 1 y escribe el resultado en CPSR para la siguiente oración

TST R1, # 0xffe ; equivalente a if (R1 y 0xffe)

TST R1, #% 1 ; prueba si el bit más bajo es 1,% significa binario

n BIC operación clara

BIC R0 , R0, # 0xF           ; equivalente a R0  & = ~ (0xF)

BIC R0 , R0, #% 1011;  Esta instrucción borra los bits 0 1 3 en R0, los bits restantes permanecen;% significa binario, 0x significa hexadecimal

6. Compare la instrucción CMP

n CMP compara dos operandos y almacena el resultado en CPSR para la siguiente oración

CMP R0, R1 ; comparar R0, R1

7. Instrucción de transmisión de instrucciones de registro múltiple, LDM, STM

Similar a pasar un BUFFER al registro a la vez, o viceversa. Generalmente, se debe seguir un método de cambio de dirección

n LDM transfiere datos de múltiples registros BUFFER para transferir datos a

LDMIA R0 !, {R3-R9}  ; Agregue los datos del espacio continuo en la dirección señalada por R0 y guárdelo en R3-R9,! Significa que el valor R0 se actualiza, y el sufijo IA significa aumentar por WORD

LDMFD SP !, {R0-R7, PC} ^ ; Recuperar la escena, devuelve el manejo de excepciones, ^ significa que no se permite su uso en modo de usuario.

n STM transfiere valores de la lista de registro al espacio de almacenamiento.

STMIA R1 !, {R3-R9}  ; Almacene los datos de R3-R9 en la dirección indicada por R1, y el valor de R1 se actualiza.

STMFD SP !, {R0-R7, LR} ; Guardar en el sitio, poner R0 ~ R7, LR en la pila

  stmfd sp!, {r8-r9} ,把SP寄存器对庆的地址的值存到R8,R9当中.!表示最后的值写入SP中。Fd表示

8. Deformación de instrucciones ARM

La mayoría de las instrucciones pueden ser seguidas por dos bits especiales para indicar el juicio especial de CPSR

S, que indica que el comando actual se reescribe en CPSR después de la ejecución

subs, Agrega

Dependiendo de las condiciones específicas, solo el CPSR cumple con las condiciones especificadas para referirse a esta instrucción

BEQ es en  realidad la ejecución condicional de B + EQ.

addne  significa que ADD + NE comienza a agregar.

9. Modo de direccionamiento de la instrucción ARM

  El método de direccionamiento es localizar la dirección real de acuerdo con el código de dirección proporcionado en la instrucción Hay 9 métodos de direccionamiento en ARM

l Registro de direccionamiento

Direccionamiento directo con número de registro, más comúnmente utilizado

  MOV R1, R2; R2-> R1

l direccionamiento inmediato

Es decir, el código de dirección en la instrucción es el operando en sí mismo, que puede extraerse y usarse inmediatamente, con un # antes del número inmediato, de lo contrario representa una dirección

SUBS R0, R0, # 1; R0 -1 -> R0

Tenga en cuenta la diferencia con SUBS R0, R0, 1

l Registro de direccionamiento offset

Este es el modo de direccionamiento único de ARM. Cuando el segundo operando es un registro, puede realizar una operación de cambio antes de realizar la operación

MOV R0, R2, LSL # 3  ; la lógica de R2 se desplaza 3 bits hacia la izquierda, y el resultado se coloca en R0, es decir, R0 = R2 * 8

ANDS R1, R1, R2, LSL R3; el valor de RS se desplaza hacia la izquierda por R3, y luego la operación AND con R1, el resultado se pone en R1

Las operaciones de desplazamiento son LSL (desplazamiento lógico a la izquierda), LSR (desplazamiento lógico a la derecha), ASR (desplazamiento aritmético a la derecha), ROR (desplazamiento cíclico a la derecha), desplazamiento RRX a la derecha

 

l Registrar direccionamiento indirecto

Es decir, el valor en el registro es una dirección, use [] para sacar y ubicar la dirección

 LDR R2, [R0]; tome el valor de R0 como la dirección, saque el valor correspondiente y asígnelo a R2

l direccionamiento base

Agregar un desplazamiento al valor de la dirección del registro

LDR R2, [R3, # 0x0F]; el valor en R3 más 0x0F, toma el valor de esta dirección y lo asigna a R @

l direccionamiento relativo

La variante del direccionamiento base, la dirección de referencia es proporcionada por el registro de la PC, y el segmento de dirección en la instrucción se usa como desplazamiento. La suma de los dos es la dirección efectiva, y el siguiente es el direccionamiento relativo de BL

BL SIGUIENTE

...

SIGUIENTE

    ...

MOV PC, LR  ; regreso de la subrutina

10. Pseudoinstrucciones de ADS ARM

  Macros similares al lenguaje C, preprocesadas por ensamblador.

l instrucción de definición de símbolo

Definiciones de variables globales GBLA, GBLL, GBLS

Definición de variables locales LCLA, LCLL, LCLS

Asignación variable SETA, SETL, SETS

Entre las pseudoinstrucciones anteriores, la última A significa asignar una variable aritmética, L significa asignar una variable lógica y s significa asignar una cadena

GBLL codedbg; declarar una variable lógica global

Codebg SETL {TRUE}; Establezca la variable en {TRUE}

LCLA bitno; declarar una variable aritmética

Bitno SETA 8; establecer el valor variable en 8

l Directiva de definición de datos

n SPACE define un espacio de memoria, y se inicializa con 0

{label} SPACE expr

 DataBuf SPACE 100; Definir 100 bytes de espacio largo, sin firmar char DataBuf [100];

n DCB define un espacio de memoria de bytes continuo, inicializado con la expresión expr de la pseudoinstrucción. Generalmente se puede usar para definir la tabla de datos o la cadena de texto. (En este momento es equivalente a SETS), usado para el BUFFER binario inicial

      {label} DCB expr {, expr ...}

       Dest DCB -120,20,36,55; equivalente a char sin signo Dest [] = {-120,20,36,55};

n El espacio de memoria de una palabra definida por DCU (DCB es byte) e inicializada con la siguiente expresión

      _RESET DCU Reset; Equivalente a DWORD _RESET [] = {Reset};

 

n MAP define una memoria estructurada, que es equivalente a definir una estructura C

n FILED define un miembro de una memoria estructurada

MAP 0x00, R9; Definir la tabla de memoria, la dirección es R9

Timer FIELD 4; defina el campo de datos Timer, la longitud es de 4 palabras

Attrib FIELD 4; Definir el campo de datos Attrib, 4 palabras de largo

String FILED 100; Define el campo de datos String, la longitud es de 100 palabras

Equivalente a la definición del lenguaje C:

struct {

Temporizador DWORD;

DWORD Attrib;

Cadena de Char [100];

} R9;

 

11. Directivas diversas

n Alineación de bytes ALINEAR

ALINEAR; declarar alineación de 4 bytes

n Definir una definición constante numérica EQU

NOMBRE EQU expr {type}

  PLLCON EQU 0xE01FC080; defina PLLCON, macro similar a C o constante de C ++

n Incluir archivos GET e INCLUDE

INCLUYE lpc2106.inc

n instrucción de vacío NOP

Durante el montaje, será reemplazado por la no operación de ARM, como MOV R0, R0, que generalmente se usa para demora y ocupación.

n Declarar un símbolo externo IMPORT, EXTERN

IMPORT, EXTERN importa un símbolo al exterior, generalmente una variable global de programa externo

 

n Compilación condicional: []. Definiciones similares a #ifdef de C.

Formato: Expresión condicional

        Rama condicional

        El |

        Rama condicional

      ]

Ejemplo 1:

 [ENTRY_BUS_WIDTH = 32 ; 类似 #if ENTRY_BUS_WIDTH = 32

      b ChangeBigEndian; DCD 0xea000007

   ]; Similar a #endif 

Ejemplo 2: [CLKDIV_VAL> 1; Similar a #if CLKDIV_VAL> 1

bl MMU_SetAsyncBusMode

          |; Similar a #else 

        bl MMU_SetFastBusMode; valor por defecto.

]; Similar a #endif

          Ejemplo 3 [THUMBCODE es similar a #ifdef THUMBCODE

                                   bx lr

                                 |; Similar a #else

                              mov pc, lr

                               ]; Similar a #endif

n Definición del segmento ÁREA

n Definición del conjunto de instrucciones CODE16 y CODE32

La instrucción es el conjunto de instrucciones Thumb (conjunto de instrucciones comprimido, 16 bits por instrucción). O conjunto de instrucciones ordinario de 32 bits

n Fin del montaje: FIN

n entrada de programa ENTRADA

 

Una estructura básica del programa ARM

Estructura ensambladora ARM

El código fuente está compuesto de archivos de texto. Según los diferentes compiladores, se divide en dos grandes grupos. Uno es el ensamblador ADS y el otro es el formato de ensamblaje GNU. Ambos son iguales en el conjunto de instrucciones, pero en la pseudoinstrucción. Estructura del programa Los métodos son diferentes e iguales. Esta sección explica principalmente el formato de ensamblaje ADS.

   El ensamblador de ADS, contiene principalmente los siguientes tipos de programas

n Ensamble el programa fuente, el nombre del sufijo es .S

n Montar archivos de inclusión, el nombre del sufijo es .inc

n Si se mezcla con la programación en C ... C, .h también se puede reconocer

         Formato de declaración de ensamblaje ARM     

           [ Etiqueta] <comando | condición | S> <operando> [; comentario]

 

l Todas las etiquetas se escriben en la cuadrícula superior, mientras que las instrucciones y los pseudocomandos no se pueden escribir en la cuadrícula superior

l Los identificadores (etiquetas, instrucciones) distinguen entre mayúsculas y minúsculas, por lo que las etiquetas y las instrucciones deben escribirse de la misma manera. Las pseudoinstrucciones, instrucciones y nombres de registro generales pueden estar en mayúsculas

l La nota comienza con ; se puede escribir en la cuadrícula superior

l Puede usar \ para escribir declaraciones demasiado largas en ramas

l Las variables y las constantes deben definirse en la línea superior de una línea.

 

Escritura constante

l constante numérica

Escriba números directamente en el programa, decimal 12,256, hexadecimal 0x1228,

l Carácter constante

Similar a la definición de C, use SETS para definir constantes de caracteres

HOLA ESTABLECE "¡Hola, el mundo!"

l lógica constante

El verdadero lógico es {VERDADERO}, el falso lógico es {FLASE}

  Conjuntos de prueba {TURE}

       Definición de segmento de ensamblador

            Cualquier programa debe estar segmentado. El lenguaje C generalmente está segmentado automáticamente por el compilador (dividido en .Text, segmentos .Data y similares), pero en el programa de nivel inferior, como el ensamblador, el desarrollador en sí. Incluye lo siguiente Segmento

l Al menos un segmento de código, y el segmento de código es de solo lectura, correspondiente a (.Text)

l No puede haber segmento de datos o múltiples segmentos de datos.

l Cada segmento termina con FIN

 

AREA  define un segmento

ÁREA nombre del segmento Atributo 1, Atributo 2,

Ejemplos: AREA Init, CODE, READONLY

l ENTRY indica la entrada de un segmento

l END finaliza un segmento

 

         ABC EQU 0x12

            ÁREA Ejemplo, CÓDIGO, READONLY

            ENTRADA

        START MOV R7, # 10

              MOV R6, # 5

              AGREGAR R6, R6, R7

              si   

              FINAL

 

Requisitos de formato del ensamblador ADS ARM

1. Todas las etiquetas deben escribirse en la cuadrícula superior.

2. Todos los comandos no se pueden escribir en la cuadrícula superior, generalmente inserte la tecla Tab al comienzo de la línea

3. En ADS ARM, distingue entre mayúsculas y minúsculas. Se recomienda que las etiquetas, instrucciones, pseudoinstrucciones y nombres de registro estén en mayúsculas

4. Uso de notas, tomar la iniciativa

5. Cada programa tiene al menos un ÁREA en el código (READONLY)

6. Cada segmento debe terminar con END (no puede ser la cuadrícula superior)

 

Las directivas más comunes AREA, EQU, DCB, END, ENTRY, EXPORT, GOBEL, IMPORT,

 

Pseudo definiciones comunes

l carácter de definición DCB

   Str DCB "hola, mundo"

10 artículos originales publicados · Me gusta 11 · Visitas 20,000+

Supongo que te gusta

Origin blog.csdn.net/u013323018/article/details/88896167
Recomendado
Clasificación