Aprendizaje de microprocesador notas # 1

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á . .

2 artículos originales publicados · Me gusta0 · Visitas 20

Supongo que te gusta

Origin blog.csdn.net/weixin_42732155/article/details/105465750
Recomendado
Clasificación