微处理器学习札记#1

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
}


未完待续。。。

发布了2 篇原创文章 · 获赞 0 · 访问量 20

猜你喜欢

转载自blog.csdn.net/weixin_42732155/article/details/105465750