您的位置 首页 产品

arm汇编ldr,str,b,bl指令

B或BL指令引起处理器转移到子程序名处开始执行。两者的不同之处在于BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链…

B或BL指令引起处理器转移到“子程序名”处开端履行。两者的不同之处在于BL指令在转移到子程序履行之前,将其下一条指令的地址拷贝到R14(LR,链 接寄存器)。由于BL指令保存了下条指令的地址,因而运用指令“MOV PC ,LR”即可完结子程序的回来。而B指令则无法完结子程序的回来,只能完结单纯的跳转。用户在编程的时分,可依据详细运用选用适宜的子程序调用句子。

  AREA Init,CODE,READONLY

;该伪指令界说了一个代码段,段名为Init,特点只读
ENTRY ;程序的进口点标识

.

.

bl delay ;调用推迟

.

.

mov pc,lr ;回来

下面的在BLOG中看到觉得讲得比较详细就拷过来了

ARM汇编指令的一些总结
ARM汇编指令许多,可是真实常用的不是许多,并且需求仔细揣摩的又更少了。
比较有用的是MOV B BL LDR STR
仍是经过详细汇编代码来学习吧。
@ disable watch dog timer
mov r1, #0x53000000 //当即数寻址方法
mov r2, #0x0
str r2, [r1]
当即数寻址方法,当即数要求以“#”作前缀,关于十六进制的数,还要求在#后边加上0x或许&。STR是比较重要的指令了,跟它对应的是LDR。 ARM指令集是加载/存储型的,也便是说它只处理在寄存器中的数据。那么关于体系存储器的拜访就常常用到STR和LDR了。STR是把寄存器上的数据传输 到指定地址的存储器上。它的格局我个人认为很特别:
STR(条件) 源寄存器,<存储器地址>
比方 STR R0, [R1] ,意思是R0-> [R1],它把源寄存器写在前面,跟MOV、LDR都相反。
LDR应该对错常常见了。LDR便是把数据从存储器传输到寄存器上。并且有个伪指令也是LDR,因而我有个百思不得其解的问题。看这段代码:
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_F
ldr r2,=0x55aa // 0x55aa是个当即数啊,前面加个=干什么?
关于傍边的ldr 那句,我就不了解了,假如你把=去掉,是不能经过编译的。我查了一些材料,个人感觉知道了原因:这个=应该表明LDR不是ARM指令,而是伪指令。作为伪指令的时分,LDR的格局如下:
LDR 寄存器, =数字常量/Label
它的效果是把一个32位的地址或许常量调入寄存器。嗬嗬,那咱们可能会问,
“MOV r2,#0x55aa”也可以啊。应该是这样的。不过,LDR是伪指令啊,也便是说编译时编译器会处理它的。怎样处理的呢?——规矩如下:假如该数字常量 在MOV指令规模内,汇编器会把这个指令作为MOV。假如不在MOV规模中,汇编器把该常量放在程序后边,用LDR来读取,PC和该常量的偏移量不能超过 4KB。
然后说一下跳转指令。ARM有两种跳转方法。
(1) mov pc <跳转地址〉
这种向程序计数器PC直接写跳转地址,能在4GB接连空间内恣意跳转。
(2)经过 B BL BLX BX 可以完结在当时指令向前或许向后32MB的地址空间的跳转(为什么是32MB呢?寄存器是32位的,此刻的值是24位有符号数,所以32MB)。
B是最简略的跳转指令。要注意的是,跳转指令的实践值不是肯定地址,而是相对地址——是相对当时PC值的一个偏移量,它的值由汇编器核算得出。
BL十分常用。它在跳转之前会在寄存器LR(R14)中保存PC的当时内容。BL的经典用法如下:
bl NEXT ; 跳转到NEXT
……
NEXT
……
mov pc, lr ; 从子程序回来。
最终提一下Thumb指令。ARM体系结构还支撑16位的Thumb指令集。Thumb指令集是ARM指令集的子集,它保留了32位代码优势的一起还大大 节省了存储空间。由于Thumb指令集的长度只要16位,所以它的指令比较多。它和ARM各有自己的运用场合。关于体系性能有较高要求,应运用32位存储 体系和ARM指令集;关于体系本钱和功耗有较高要求,应运用16位存储体系和ARM指令集。
对ARM反常(Exceptions)的了解
分类:技能笔记
毕设笔记
1.对ARM反常(Exceptions)的了解
一切的体系引导程序前面中会有一段相似的代码,如下:
.globl _start ;体系复位方位
_start: b reset ;各个反常向量对应的跳转代码
ldr pc, _undefined_instruction ;未界说的指令反常
ldr pc, _software_interrupt ;软件中止反常
ldr pc, _prefetch_abort ;内存操作反常
ldr pc, _data_abort ;数据反常
ldr pc, _not_used ;未运用
ldr pc, _irq ;慢速中止反常
ldr pc, _fiq ;快速中止反常

从中咱们可以看出,ARM支撑7种反常。问题时产生了反常后ARM是怎么呼应的呢?榜首个复位反常很好了解,它放在0x0的方位,一上电就履行它, 并且咱们的程序总是从复位反常处理程序开端履行的,因而复位反常处理程序不需求回来。那么怎样会履行到后边几个反常处理函数呢?
看看书后,了解了ARM对反常的呼应进程,于是就可以答复曾经的这个疑问。
当一个反常呈现今后,ARM会主动履行以下几个过程:
(1)把下一条指令的地址放到衔接寄存器LR(通常是R14),这样就可以在处理反常回来时从正确的方位持续履行。
(2)将相应的CPSR(当时程序状况寄存器)到SPSR(备份的程序状况寄存器)中。从反常退出的时分,就可以由SPSR来康复CPSR。
(3) 依据反常类型,强制设置CPSR的运转形式位。
(4)强制PC(程序计数器)从相关反常向量地址取出下一条指令履行,然后跳转到相应的反常处理程序中。
至于这些反常类型各代表什么,我也没有深究。由于往常就关怀reset了,也没有必要弄清楚。
ARM规则了反常向量的地址:
b reset ; 复位 0x0
ldr pc, _undefined_instruction ;未界说的指令反常 0x4
ldr pc, _software_interrupt ;软件中止反常 0x8
ldr pc, _prefetch_abort ;预取指令 0xc
ldr pc, _data_abort ;数据 0x10
ldr pc, _not_used ;未运用 0x14
ldr pc, _irq ;慢速中止反常 0x18
ldr pc, _fiq ;快速中止反常 0x1c
这样了解这段代码就十分简略了。碰到反常时,PC会被强制设置为对应的反常向量,然后跳转到相应的处理程序,然后再回来到主程序持续履行。
这些引导程序的中止向量,是仅供引导程序自己运用的,一旦引导程序引导Linux内核结束后,会运用自己的中止向量。
嗬嗬,这又有问题了。比方,ARM产生中止(irq)的时分,总是会跑到0x18上履行啊。那Linux内核又怎样能运用自己的中止向量呢?原因在于 Linux内核选用页式存储办理。注册MMU的页面映射今后,CPU所宣布的地址便是虚拟地址而不是物理地址。就Linux内核而言,虚拟地址0x18经 过映射今后的物理地址便是0xc000 0018。所以Linux把中止向量放到0xc000 0018就可以了。
MMU的两个首要效果:
(1)安全性:规则拜访权限
(2) 供给地址空间:把不接连的空间转换成接连的。
第2点是不是完结页式存储的意思?

.globl _start ;体系复位方位
_start: b reset ;各个反常向量对应的跳转代码
ldr pc, _undefined_instruction ;未界说的指令反常

……

_undefined_instruction :
.word undefined_instruction

或许有人会有疑问,同样是跳转指令,为什么榜首句用的是 b reset;
然后边的几个都是用ldr?

为了了解这个问题,咱们以未界说的指令反常为例。

当产生了这个反常后,CPU总是跳转到0x4,这个地址是虚拟地址,它映射到哪个物理地址
取决于详细的映射。
ldr pc, _undefined_instruction
相对寻址,跳转到标号_undefined_instruction,但是真实的跳转地址其实是_undefined_instruction的内容——undefined_instruction。那句.word的相当于:
_undefined_instruction dw undefined_instruction (详见毕设笔记3)。
这个地址undefined_instruction到底有多远就难说了,或许和标号_undefined_instruction在同一个页面,或许在 很远的当地。不过除了reset,其他的反常是MMU开端作业之后才可能产生的,因而undefined_instruction 的地址也经过了MMU的映射。
在刚加电的时分,CPU从0x0开端履行,MMU还没有开端作业,此刻的虚拟地址和物理地址相同;另一方面,重启在MMU开端作业后也有可能产生,假如reset也用ldr就有问题了,由于这时分虚拟地址和物理地址彻底不同。

因而,之所以reset用b,便是由于reset在MMU树立前后都有可能产生,而其他的反常只要在MMU树立之后才会产生。用b reset,reset子程序与reset向量在同一页面,这样就不会有问题(b是相对跳转的)。假如二者相距太远,那么编译器会报错的

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/277127.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部