ARM之点亮led

几条简单的汇编:
LDR(load)读内存命令
LDR R1 [R0]
假设R0的地址是x,就是把地址x的数据(4个字节)存放在R1上

LDM(many):读内存,写入多个寄存器
STM:把多个寄存器的值写入内存

ldia(ia:后增,也就是先读取,sp后增加)
ldia sp (sp,fp)先把sp所在的4个字节给sp(因为sp的寄存器编号大于fp),之后sp=sp+4,再..

stmdb (db:sp栈顶指针先减,寄存器内容后存 sp减小,叫做降序栈,sp指向顶端,叫做满栈,指向底端,叫做空栈
例如 stmdb:sp! (pc,fp) //括号内的值,根据对应寄存器的数字大小,决定谁先读入,比如pc对应寄存器r15,则pc先读入

                                            //感叹号表示sp==最终被修改的值,否则执行完后sp还是原来4096的值
假设此时sp为4096,执行第一次指令,先减:sp=sp-4,之后在4095-4092的位置存放pc内容。之后再减-4,在4091-4038的地方存放fp的内容。


STR(store):写内存命令
B:跳转
bl:跳转并把地址保存到LR寄存器中


MOV(move)
mov A B
把B的值赋给A


Add r1 r2 r3 //r1=r2+r3
Sub r1 r2 r3//r1=r2-r3

可能会有疑问,那这样LDR和MOV不是同个作用了吗?
其实两者作用相同,当应用场合不同。
ARM是RISC架构,数据从内存到CPU之间的移动只能用L/S指令,也就是LDR/STR。
而MOV干不了这件事,MOV只能在寄存器之间或者寄存器和立即数之间作用。
这是RISC架构和CISC架构的区别之一。

一条ARM指令占4个字节,32位。
ARM中执行指令采用流水线的方式,pc的地址==当前执行指令的地址+8.
当前执行A的指令时,已经在对A+4的指令进行译码,已经在读取A+8的指令

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/81041856