大学里学了微机原理,里面学了汇编指令,考完试后就忘得一干二净;后面汇编也用的少,以至于都完了;以为自己学的C语言,用不到汇编的;虽然经常见到,但是都果断跳过,直到要学习FREERTOS,不得不接触ARM内核,不得不学习汇编;哎,终究逃不过去的,都是自欺欺人罢了;
现在将自己遇到的汇编都记录下来,一点点增加自己的汇编指令吧;
想想为什么自己这么不喜欢汇编呢,其实最主要的原因就是太多了,记不住,懒得记;
现在写一条汇编,尽量找个方法记下他;
话不多说,直接写第一个;
1.MRS mrs -> 状态寄存器 到 通用寄存器的传送指令
(有的汇编是小写的,所以大小写都写出来,熟悉大写和小写的方式,不至于以后认不出来)
语法格式:
MRS{<cond>}<Rd>, CPSR
MRS{<cond>}<Rd>, SPSR
其中:
<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
<Rd>为目标寄存器。
(因为汇编是助记词,所以本质是二进制代码,写出格式更加清楚,可能后面有些不会写出来)
实例:
-》 读取进程栈指针,保存在寄存器 R0 里面
2 MSR mrs -》 通用寄存器到状态寄存器的传送指令。
指令的使用:
MSR指令通常用于恢复状态寄存器的内容或者改变寄存器的内容。当退出异常中断处理器程序时,如果事先保存了状态寄存器的内容通常通过MSR指令将事先保存的状态寄存器内容恢复到状态寄存器中。
当需要修改状态寄存器的内容时,通过“读取-修改-写回”指令序列完成。写回操作也是通过MSR指令完成的。
3. ISB isb -》 指令同步隔离
最严格:它会清洗流水线,以保证所有它前面的指令都执行完毕之后,才执行它后面的指令。
DSB
数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作
都执行完毕后,才执行在它后面的指令(亦即任何指令都要等待存储器访 问操作——译者注)
STR指令的格式为:
STR{条件} 源寄存器,<存储器地址>
STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。
stmdb
b用于不返回的跳转,比如跳到某个标号处,b . 其中的‘.’代表当前地址,那么 b . 就是死循环。
bl用于子程序跳转,要返回地址,返回地址存于LR中。当发生bl跳转前,会在寄存器 R14 (即LR)中保存当前PC-4,即bl跳转指令的下一条指令的地址。所以在返回时只要 MOV pc,lr 。