Tips
笔记顺序可能会乱,根据自己的想法和理解来,等之后有时间会整理。
关于ARM Thumb2指令集
指令集的字节数问题
大多数ARM Thumb2指令为2个Byte即half word,而有些嵌套有其他指令的指令,比如最常见的#指令,则需要4个Byte即一个word才能存放。
特别注意:在一般情况下,使用16位来表示,而16进制下的一个"bit"相当于2进制下的4个"bit",所以对于byte来说,一个byte分别对应2进制下8位,对应16进制下2位,而half word大小是2byte,所以half word需要用4个16进制的"bit"表示,一个word需要用8个16进制"bit"表示。
举例:
汇编语言 | 地址表示 |
---|---|
MOV r0, #10 | 08000190: F0 4F 00 0A |
LDR r2, [r1] | 08000194: 68 11 |
ADD r0, r0, r2 | 08000196: 44 10 |
从上面的例子可以看出来,每两位16进制"bit"是一个byte,所以放在一起,每四位是两个byte也就是一个half word,两个half word 组成了一个word。
关于指令的offset
指令的offset是通过两个指令地址做差运算得到,有正负之分, 特别要注意是16进制计算,可以先用大地址减去小地址然后判断正负。
特别注意: offset不需要保持和指令一样的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
}
for语句
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
}
未完待续。。。