チップ
自分の考えや理解によっては、音符の順番が乱れたり、時間のあるときに整理されたりすることがあります。
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
}
継続する。。。