自己做了ARM的SWI软中断后,真有种醍醐灌顶的感觉,对安装中断、对DCD的用法、对堆栈的操作、对CPSR和SPSR、对PC的读入,畅快淋漓啊!
一、安装中断
ARM中断和51有些像,触发中断后会跳到中断地址。只不过ARM的只有4字节,只够存一个跳转指令,然后就是下一个中断地址了,51的大一些。
在写时,一直想着怎么去跳转。因为51有ORG伪指令,可以用来定义地址,可ARM的没有。这个让我走到思维定势里了,终于在看一个PPT时,发现只要从开始写指令就行了。反正第一个是复位中断,要跳到主程序处。有时一个很简单的东西就是这样困扰你的。回想一下,老师上课也讲了,只是我没有在意,以为很简单的。
二、DCD的用法
在程序代码段中,可以用DCD指令来存储标号地址,这样连续的就方便SWI参数判断与执行了。
三、对堆栈的操作
四种情况:
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要
放入的空位置,称为空堆栈。这样就有 4 中类型的堆栈表示递增和递减的满堆栈和空堆
栈的各种组合。
(1)满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的 最高地址。指令如 LDMFA,STMFA 等。 (2)空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空 位置。指令如 LDMEA,STMEA 等。
没有什么特别的,就是给SP寄存器赋个内存地址,然后决定怎么用。
(3)满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最
低地址。指令如 LDMFD,STMFD 等。
(4)空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空
位置。指令如 LDMED,STMED 等。
四、CPSR和SPSR
CPSR意思为Current Program Statuse Register,即,当前程序状态寄存器。SPSR是在中断异常时CRSP的备份。
五、对PC的读入
由于ARM中流水线的作用,当在一条指令中读取PC的值时,这个PC指的已经是当前指令的地址+8了,即当前指令后第二条指令的地址,这个对中断跳转时有用。
其实还有很多的感受,确实当你仔细转进去去研究一个问题是,就会有很大的收获,毕竟要在一方面做到专,正所谓“不可以一物不专,不可只专一物。”用心去做,才叫学习。