您的位置 首页 产品

ARM汇编指令的一些总结

ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了。比较有用的是MOVBBLLDRSTR还是通过具体汇编代码来学习吧。@disa

ARM汇编指令许多,可是真实常用的不是许多,并且需求仔细揣摩的又更少了。

比较有用的是MOVBBLLDRSTR

仍是经过详细汇编代码来学习吧。

@ disable watch dog timer

movr1, #0x53000000//当即数寻址方法

movr2, #0x0

strr2, [r1]

MOV没有什么好说的,只需把握几个寻址方法就能够了,并且ARM的寻址方法比386的简略许多。当即数寻址方法,当即数要求以“#”作前缀,关于十六进制的数,还要求在#后边加上0x或许&。0x我们很好了解。有一次我碰到了&ff这个数,现在才理解跟0xff是相同的。

STR是比较重要的指令了,跟它对应的是LDR。ARM指令集是加载/存储型的,也便是说它只处理在寄存器中的数据。那么关于体系存储器的拜访就常常用到STR和LDR了。STR是把寄存器上的数据传输到指定地址的存储器上。它的格局我个人认为很特别:

STR(条件)源寄存器,<存储器地址>

比方STR R0, [R1],意思是R0-> [R1],它把源寄存器写在前面,跟MOV、LDR都相反。

LDR应该对错常常见了。LDR便是把数据从存储器传输到寄存器上。并且有个伪指令也是LDR,因而我有个百思不得其解的问题。看这段代码:

movr1, #GPIO_CTL_BASE

addr1, r1, #oGPIO_F

ldrr2,=0x55aa// 0x55aa是个当即数啊,前面加个=干什么?

strr2, [r1, #oGPIO_CON]

movr2, #0xff

strr2, [r1, #oGPIO_UP]

movr2, #0x00

strr2, [r1, #oGPIO_DAT]

关于傍边的ldr那句,我就不理解了,假如你把=去掉,是不能经过编译的。我查了一些材料,个人感觉知道了原因:这个=应该表明LDR不是ARM指令,而是伪指令。作为伪指令的时分,LDR的格局如下:

LDR寄存器,=数字常量/Label

它的作用是把一个32位的地址或许常量调入寄存器。嗬嗬,那我们可能会问,

“MOV r2,#0x55aa”也能够啊。应该是这样的。不过,LDR是伪指令啊,也便是说编译时编译器会处理它的。怎样处理的呢?——规矩如下:假如该数字常量在MOV指令规模内,汇编器会把这个指令作为MOV。假如不在MOV规模中,汇编器把该常量放在程序后边,用LDR来读取,PC和该常量的偏移量不能超过4KB。

这么一说,尽管似懂非懂,可是能够解说这个句子了。

然后说一下跳转指令。ARM有两种跳转方法。

(1)mov pc <跳转地址〉

这种向程序计数器PC直接写跳转地址,能在4GB接连空间内恣意跳转。

(2)经过BBLBLXBX能够完结在当时指令向前或许向后32MB的地址空间的跳转(为什么是32MB呢?寄存器是32位的,此刻的值是24位有符号数,所以32MB)。

B是最简略的跳转指令。要注意的是,跳转指令的实践值不是肯定地址,而是相对地址——是相对当时PC值的一个偏移量,它的值由汇编器核算得出。

BL十分常用。它在跳转之前会在寄存器LR(R14)中保存PC的当时内容。BL的经典用法如下:

blNEXT; 跳转到NEXT

……

NEXT

……

mov pc, lr; 从子程序回来。

最终提一下Thumb指令。ARM体系结构还支撑16位的Thumb指令集。Thumb指令集是ARM指令集的子集,它保留了32位代码优势的一起还大节操省了存储空间。因为Thumb指令集的长度只要16位,所以它的指令比较多。它和ARM各有自己的运用场合。关于体系性能有较高要求,应运用32位存储体系和ARM指令集;关于体系本钱和功耗有较高要求,应运用16位存储体系和ARM指令集。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部