マイクロプロセッサ学習ノート#1

チップ

自分の考えや理解によっては、音符の順番が乱れたり、時間のあるときに整理されたりすることがあります。

ARM Thumb2命令セットについて

命令セットのバイト数

ほとんどのARM Thumb2命令は2バイトまたはハーフワードですが、最も一般的な#命令など、他の命令とネストされた一部の命令は、4バイトまたは1ワードを格納する必要があります。
特記事項一般に、16ビットは表現に使用され、16進数の「ビット」は2進数の4「ビット」に相当するため、バイトの場合、1バイトはバイナリに対応します。次の8ビットは16進数の次の2ビットに対応し、ハーフワードサイズは2バイトなので、ハーフワードは4つの16進数「ビット」で表現する必要があり、ワードは8つの16進数「ビット」で表現する必要があります。
例:

アセンブリ言語 アドレス表現
MOV r0、#10 08000190:F0 4F 00 0A
LDR r2、[r1] 08000194:68 11
r0、r0、r2を追加 08000196:44 10

上記の例からわかるように、16進数の「ビット」は2バイトごとに1バイトなので、4ビットごとに2バイトになります。つまり、ハーフワードと2つのハーフワードが1つのワードを形成します。

命令のオフセットについて

命令のオフセットは、正と負の2つの命令アドレスの差分演算によって取得されます。特に16進数の計算に注意してください。まず、大きいアドレスから小さいアドレスを減算してから、正と負を決定できます。
特記事項: オフセットはコマンドと同じ8ビットアドレスを維持する必要はありません。
例:
0x08000190 + 0x1A-> 0x0800020A
0x0800020A-0x1A-> 0x08000190

アセンブリ言語(C)

一般的な文章

MOVは、
MOVSをキャリー
ADD加算
ADDSとキャリー
SUB減算
SUBSキャリー
MUL乗算
UDIV除算
LDRロード
STRストレージで割り当てるために使用できます。

制御フロー

ifステートメント

void func(int a){
	if(a==0){
		a=1;
	}
}

コンパイル

void func(int a){
	CMP r0,#0
	BEQ CON1
COND1 
	MOVS r0,#1
	BX lr	
}

声明

void func(int a)
{
	for(int i=0;i<5;i++){
		a--;
	}
}

コンパイル

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
}

whileステートメント

void func(int a)
{
	while(a>0){
		a--;
	}
}

コンパイル

void func(int a)
{
LOOP
	CMP r0, #0
	BLT ENDLOOP
	SUBS r0,r0,#1
	B LOOP
ENDLOOP
	BX lr
}


継続する。

オリジナルの記事を2件公開 Likes0 訪問数20

おすすめ

転載: blog.csdn.net/weixin_42732155/article/details/105465750