您好!欢迎访问江南官方体育app下载网站(JN).注册登录
产品搜索:
江南官方体育app下载网站(JN).注册登录
当前位置:首页 > 产品中心 > 32位ARM核Cortex系列
+     低压差线性稳压器
+     白光LED驱动
+     MOSFET
+     32位ARM核Cortex系列
+     CMOS逻辑电路
说说ARM汇编的LDR伪指令-【32位ARM核Cortex系列】
发布时间:2024-03-16 23:26:17 来源:江南官方体育APP下载 作者:江南app官方网站

  这是一个合法的汇编文件,它把堆栈基址设为0x0c002000,栈限设为0x0c001000,然后跳到entry所标识的C程序中执行。

  说起这个错误的原因可就话长了,简而言之是因为RISC有一个重要的概念就是所有指令等长。在ARM指令集中,所有指令长度为4字节(Thumb指令是2字节)。那问题就来了,4字节是不可能同时存的下指令控制码和32位立即数的,那么我要把一个32位立即数(比如一个32位地址值)传送给寄存器该怎么办?

  RISC CPU提供一个通用的方法就是把地址值作为数据而不是代码,从存储器中相应的位置读入到寄存器中,待会我们会看到这样的例子。

  此外ARM还提供另一种方案。由于传送类指令的指令控制码部分(cond, opcode, S, Rd, Rn域)占去了20个字节,那能提供给立即数的就只剩12个位了。

  ARM并未使用这12个位来直接存一个12位立即数,而是使用了类似有效数字一样的概念,只存8个字节的有效位和一个4位的位偏移量(偏移单位为2)。这个东西在ARM被叫做术语immed_8,有兴趣的人可以找资料了解一下,到处都有介绍。

  可以看出ARM的这个方法能直接使用的立即数是相当有限的,像0xfffffff0这样的数显然无法支持。别着急,ARM的传送类指令中还有一个MVN指令可以解决该问题。显然0x0000000f是一个有效立即数,MVN会先将其取反再传送,这样有效立即数的范围又扩充了一倍。

  可就算如此仍有大量的32位立即数是无效的,比如上面那个例子中的0x0c002000和0x0c001000。面对这种问题一是使用RISC的通用方法,二是分次载入。

  感觉很狡猾是吧,呵呵。但是要注意它和方法一的一大区别:需要多条指令。那么在一些对指令数目有限制的场合就无法使用它,比如异常向量表处要做长跳转(超过32MB)的话就只能用方法一;还有就是在同步事务中该操作不是原子的,因此可能需要加锁。

  扯了这么多再回到LDR伪指令上来。显然上面的内容是复杂繁琐的,如果然程序员在写程序的时候还要考虑某个数是不是immed_8一定超级麻烦,因此为了减轻程序员的负担才引入了LDR伪指令。

  你一定很好奇第一段代码demo.s被GNU AS变成了什么,好,让我们在Linux环境下执行下面的命令:

  由于entry还没连上目标地址,objdump反汇编会认为是0,我们先不管它。另外两条LDR伪指令变成了实际的LDR指令!但目标很奇怪,都是[pc, #4]。那好我们看看[pc, #4]是什么。

  我们知道pc中存放的是当前指令的下下条指令的位置,也就是. + 8。那么上面的第一条指令ldr sp, [pc, #4]中的pc就是0x8,pc + 4就是0xc,而[0xc]的内容正是0x0c002000;同理,第二条ldr指令也是如此。显然这里LDR伪指令采用的是RISC通用的方法。

  最后一点补充,我发现arm-elf-gcc通常都用累加法。如C语句中的i = 0x100ffc04;会变成类似于以下的语句:

  ARM中的伪指令不是真正的ARM指令或者Thumb指令,这些伪指令在汇编编译器对源程序进行汇编处理时,被替换为相应的ARM或者Thumb指令(序列)。

  u 当expr所表示的地址值没有超过MOV或MVN指令中的地址取值范围时,编译器用合适的MOV或者MVN指令代替LDR伪指令。

  u 当expr表示的地址值超过了MOV或者MVN指令中的地址的取值范围(第二操作数的取值范围)时,编译器将该常数放在数据缓冲区中,同时用一条基于PC的LDR指令读取该常数。

  关于label-expr的介绍我不是很理解。不理解其中关于“连接重定位伪操作”。(P144)

  声明:本文为我在学习杜春雷编著的《ARM体系结构与编程》时做的总结笔记,文中摘录了书中的很多内容。

江南官方体育app 上一篇:ARM汇编书写格式及符号(sym 下一篇:ARM汇编语言 - 简介 [三]
江南官方体育app 江南官方体育APP下载 新闻中心 产品中心 江南app官方网站 联系我们 网站地图
产品关键词: 低压差线性稳压器 | DC/DC转换器 | AC/DC转换器 | 电源管理单元 | 霍尔开关
白光LED驱动 | 音频功放 | 电压检测 | Li-ion电池充电管理 | 场效应管 | 模拟开关
Copyright [c]2018 江南官方体育app下载网站(JN).注册登录 版权所有 All Rights Reserved.
备案号:粤ICP备170082978号-17 技术支持:江南官方体育app
地 址:深圳市宝安区航城大道航城创新工业园
    A5栋二楼2016-218
联系人:刘先生 13424245917
    张先生 13751282129
电 话:0755-86249117
传 真:0755-26502485
邮 箱:info@ztevone.com