Consejos
El orden de las notas puede estar desordenado, de acuerdo con sus propios pensamientos y comprensión, y se resolverá más tarde cuando haya tiempo.
Acerca del conjunto de instrucciones ARM Thumb2
El número de bytes en el conjunto de instrucciones.
La mayoría de las instrucciones ARM Thumb2 son 2 bytes o medias palabras, mientras que algunas instrucciones anidadas con otras instrucciones, como la instrucción # más común, requieren 4 bytes o una palabra para almacenar.
Nota especial : en general, se utilizan 16 bits para representar, y un "bit" en hexadecimal es equivalente a 4 "bits" en binario, por lo que para el byte, un byte corresponde al binario Los siguientes 8 bits corresponden a los siguientes 2 bits en hexadecimal, y el tamaño de la mitad de la palabra es de 2 bytes, por lo que la mitad de la palabra debe representarse con 4 "bits" hexadecimales, y una palabra debe representarse con 8 "bits" hexadecimales.
Ejemplos:
Lenguaje ensamblador | Representación de dirección |
---|---|
MOV r0, # 10 | 08000190: F0 4F 00 0A |
LDR r2, [r1] | 08000194: 68 11 |
AGREGAR r0, r0, r2 | 08000196: 44 10 |
Como se puede ver en el ejemplo anterior, cada dos "bits" hexadecimales es un byte, por lo tanto, cada cuatro bits son dos bytes, es decir, media palabra, dos medias palabras forman una palabra.
Sobre el desplazamiento de la instrucción
El desplazamiento de la instrucción se obtiene mediante la operación de diferencia de las dos direcciones de instrucción, que es positiva y negativa, especialmente preste atención al cálculo hexadecimal, primero puede restar la dirección pequeña de la dirección grande y luego determinar lo positivo y lo negativo.
Nota especial: el desplazamiento no necesita mantener la misma dirección de 8 bits que el comando
Ejemplo:
0x08000190 + 0x1A-> 0x0800020A
0x0800020A-0x1A-> 0x08000190
Lenguaje ensamblador (C)
Oraciones comunes
MOV se puede utilizar para asignar
MOVS con carry
ADD suma
ADDS con carry
SUB sustracción
SUBS con carry
MUL multiplicación
División UDIV
LDR carga
STR almacenamiento
Flujo de control
si la declaración
void func(int a){
if(a==0){
a=1;
}
}
Compilación
void func(int a){
CMP r0,#0
BEQ CON1
COND1
MOVS r0,#1
BX lr
}
para declaración
void func(int a)
{
for(int i=0;i<5;i++){
a--;
}
}
Compilación
void func(int a)
{
MOVS r1,#0
LOOP
CMP r1, #5
BLS ENDLOOP
ADDS r1,r1,#1
SUBS r0,r0,#1
B LOOP
ENDLOOP
BX lr
}
mientras que la declaración
void func(int a)
{
while(a>0){
a--;
}
}
Compilación
void func(int a)
{
LOOP
CMP r0, #0
BLT ENDLOOP
SUBS r0,r0,#1
B LOOP
ENDLOOP
BX lr
}
Continuará . .