ldr伪指令的第二个操作数之前有个=,意思是第一个操作书 = 第二个操作数,相当明了

核心就在于对于用.word指令在.text段里另外定义一段内存,用ldr r0,[pc + x(可以算出.text段里的内存地址)]这种基于PC的偏移量方式加载内存里的内容到寄存器

看下源代码和反汇编的结果就清楚了

伪指令用于大的常数:

源代码:

  1. top:
  2. ldr r0,=
  3. add r1,r2,r3
  4. eor r1,r2,r3
  5. eor r1,r2,r3
  6. bottom:
  7. b top

反汇编:

  1. prebuilts/gcc/linux-x86/arm/arm-eabi-./bin$ ./arm-eabi-objdump -d test.o
  2.  
  3. test.o: file format elf32-littlearm
  4.  
  5. Disassembly of section .text:
  6.  
  7. <top>:
  8. : e59f000c ldr r0, [pc, #] ; 14 <bottom+0x4>
  9. : e0821003 add r1, r2, r3
  10. : e0221003 eor r1, r2, r3
  11. c: e0221003 eor r1, r2, r3
  12.  
  13. <bottom>:
  14. : eafffffa b <top>
  15. : 00bc614e .word 0x00bc614e

伪指令用于标签:

源代码:

  1. top:
  2. ldr r0,=bottom
  3. add r1,r2,r3
  4. eor r1,r2,r3
  5. eor r1,r2,r3
  6. bottom:
  7. b top

反汇编:

  1. prebuilts/gcc/linux-x86/arm/arm-eabi-./bin$ ./arm-eabi-objdump -d test.o
  2.  
  3. test.o: file format elf32-littlearm
  4.  
  5. Disassembly of section .text:
  6.  
  7. <top>:
  8. : e59f000c ldr r0, [pc, #] ; 14 <bottom+0x4>
  9. : e0821003 add r1, r2, r3
  10. : e0221003 eor r1, r2, r3
  11. c: e0221003 eor r1, r2, r3
  12.  
  13. <bottom>:
  14. : eafffffa b <top>
  15. : .word 0x00000010

ldr指令用于常数:

源代码:

  1. top:
  2. ldr r0,[r0]
  3. add r1,r2,r3
  4. eor r1,r2,r3
  5. eor r1,r2,r3
  6. bottom:
  7. b top

反汇编:

  1. prebuilts/gcc/linux-x86/arm/arm-eabi-./bin$ ./arm-eabi-objdump -d test.o
  2.  
  3. test.o: file format elf32-littlearm
  4.  
  5. Disassembly of section .text:
  6.  
  7. <top>:
  8. : e5900000 ldr r0, [r0]
  9. : e0821003 add r1, r2, r3
  10. : e0221003 eor r1, r2, r3
  11. c: e0221003 eor r1, r2, r3
  12.  
  13. <bottom>:
  14. : eafffffa b <top>

ldr指令用于标签:

源代码:

  1. top:
  2. ldr r0,bottom
  3. add r1,r2,r3
  4. eor r1,r2,r3
  5. eor r1,r2,r3
  6. bottom:
  7. b top

反汇编:

  1. prebuilts/gcc/linux-x86/arm/arm-eabi-./bin$ ./arm-eabi-objdump -d test.o
  2.  
  3. test.o: file format elf32-littlearm
  4.  
  5. Disassembly of section .text:
  6.  
  7. <top>:
  8. : e59f0008 ldr r0, [pc, #] ; 10 <bottom>
  9. : e0821003 add r1, r2, r3
  10. : e0221003 eor r1, r2, r3
  11. c: e0221003 eor r1, r2, r3
  12.  
  13. <bottom>:
  14. : eafffffa b <top>

ARM7ldr指令与ldr伪指令的更多相关文章

  1. ARM中LDR伪指令与LDR加载指令

    ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是“LDR Rn,=expr”.下面举一个例子来说明它的用法. COUNT EQU       0x4000310 ...

  2. ARM汇编中ldr伪指令和ldr指令(转载)

    转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...

  3. ARM LDR伪指令使用方法具体解释

    LDR伪指令 10.45 LDR pseudo-instruction   功能:把一个32位马上数或一个32位的内存地址载入到一个寄存器中. 注意:这里描写叙述的是LDR伪指令,而不是LDR指令   ...

  4. 转 -- ARM 中 LDR伪指令

    我们知道ARM CPU中有一条被广泛使用的指令LDR,它主要是用来从存储器(确切地说是地址空间)中装载数据到通用寄存器.但不论是ARMASM还是GNU ARM AS,都提供了一条与之同名的伪指令LDR ...

  5. 8.adr与ldr伪指令的区别

    ldr和adr都是伪指令,区别是ldr是长加载.adr是短加载. 重点:adr指令加载符号地址,加载的是运行时地址: ldr指令加载符号地址时,加载的是链接地址.

  6. LDR伪指令与ADR伪指令的区别

    测试代码 ldr r0, _start adr r0, _start ldr r0, =_start nop mov pc, lr _start: nop 设置代码的起始地址为 0x0c008000, ...

  7. 汇编指令:ldr和str,ldm和stm的区别

    (1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register.下面这条语句就说明的很清楚: LDR   R1,     [R2] R1<— ...

  8. arm汇编指令--str ldr

    STR :把寄存器中的字保存到存储器(寄存器到存储器) 示例: STR R0,[R1],#8             :将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1.STR ...

  9. LDR详解

    ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是"LDR Rn,=expr".下面举一个例子来说明它的用法. COUNT EQU       ...

随机推荐

  1. Mysql单实例脚本自动化安装

    安装包:mysql-5.6.31.tar.gz 已有配置文件:my.cnf *注意:本次Mysql的配置文件是在my.cnf的基础上更改得到的,my.cnf存放路径为/opt/rh/my.cnf 脚本 ...

  2. DEDECMS中,list标签和pagelist标签

    列表数据标签:dede:list {dede:list col='' titlelen='' infolen='' imgwidth='' imgheight='' orderby='' pagesi ...

  3. centos7搭建NIS与NFS综合应用

    实验环境: centos7(服务端)        redhat enterprise linux 7.2(客户端) 实验目的:用centos7的账号,能在redhat enterprise linu ...

  4. java中的synchronized关键字

    参考:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html 多线程并发问题的根因: 在一个对象中有一个变量i=0,有两个线 ...

  5. Oracle 动态视图1 V$LOCK

    v$lock显示数据库当前持有锁情况 Column Datatype Description SID NUMBER 会话ID TYPE VARCHAR2(2) 表示锁的类型.值包括TM,TX,等 ID ...

  6. oracle通过透明网关连接mysql的配置

    之前配置过连接TD的,这一篇是介绍连接Mysql的配置很详细. http://blog.itpub.net/12679300/viewspace-1177222/

  7. python中文件的复制

    python中文件的复制 python的os模块有很多文件目录相关的函数,但没有提供直接复制文件的函数,当然可以通过边都边写的方式复制文件.想要直接复制文件可以通过shutil模块 shutil模块是 ...

  8. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?

    既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?把SessionFactory,Session,Transcational封装成包含crud的 ...

  9. 预告:准备开个坑,集中学习一下esp32模块

    对这个模块有兴趣的可以关注我以后的更新,寒假会抽空写几篇心得.

  10. linux驱动系列之makefile

    在linux环境下做嵌入式无论是编写应用程序还是驱动程序等等,都需要用make来进行程序的编译,就需要学会自己编写Makefile.Makefile主要的作用有3点:1.决定编译哪些文件 2.怎样编译 ...