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"