Privilege除了System模式外,其他5种为异常模式 各种模式的切换,程序员通过代码切换,(CPSR寄存器);也可以CPU在某些情况下自动切换(中断或者按复位键)
注意:System模式使用user模式寄存器集
注意:这些操作只能在 ARM 态执行。
异常处理中有一些是硬件自动做的,有一些是程序员需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何写代码。
以上说的是CPU设计时提供的异常向量表,一般成为一级向量表。有些CPU为了支持多个中断,还会提供二级中断向量表,处理思路类似于这里说的一级中断向量表。
两个 S 用于不同的指令,名称相同,但是在不同的指令结合却有不同的作用
**注意**
- 条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果。
- 条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行。
**注意**:PC指向正被取指的指令,而非正在执行的指令
协处理器的学习要点 不必深究 只看一般用法,不详细区分参数细节,否则会陷入很多复杂未知中。关键在于理解,而不在于记住。
举例: stmia sp, {r0 – r12} 将r0存入sp指向的内存处(假设为0x30001000);然后地址+4(即指向0x30001004),将r1存入该地址;然后地址再+4(指向0x30001008),将r2存入该地址······直到r12内容放(0x3001030),指令完成。 一个访存周期同时完成13个寄存器的读写
!
的作用
ldmia r0, {r2 – r3}
ldmia r0!, {r2 – r3}
感叹号的作用就是r0的值在ldm过程中发生的增加或者减少最后写回到r0去,也就是说ldm时会改变r0的值。
^
的作用
ldmfd sp!, {r0 – r6, pc}
ldmfd sp!, {r0 – r6, pc}^
^的作用:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。
总结:批量读取或写入内存时要用ldm/stm指令各种后缀以理解为主,不需记忆,最常见的是stmia
(空堆栈递增)和stmfd
(满堆栈递减)。
谨记:操作栈时使用相同的后缀(LDM/STM)就不会出错,不管是满栈还是空栈、增栈还是减栈。
@
用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//
类似。#
做注释,一般放在行首,表示这一行都是注释而不是代码。:
以冒号结尾的是标号。.
点号在gnu汇编中表示当前指令的地址。#
立即数前面要加#或 $
,表示这是个立即数。adr与ldr
ARM中有一个ldr指令,还有一个ldr伪指令 一般都使用ldr伪指令而不用ldr指令
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182167.html原文链接:https://javaforall.cn