关闭

ldr和ldr伪指令

273人阅读 评论(0) 收藏 举报

ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。

LDR伪指令的形式是“LDR Rn,=expr”。下面举一个例子来说明它的用法。

COUNT EQU       0x40003100

……

LDR       R1,=COUNT

MOV      R0,#0

STR       R0,[R1]

COUNT是我们定义的一个变量,地址为0x40003100。这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。

LDR       R1,=COUNT是将COUNT这个变量的地址,也就是0x40003100放到R1中。

MOV      R0,#0是将立即数0放到R0中。最后一句STR      R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就是将0放到地址为0x40003100的存储单元中去。可 见这三条指令是为了完成对变量COUNT赋值。用三条指令来完成对一个变量的赋值,看起来有点不太舒服。这可能跟ARM的采用RISC有关。

下面还有一个例子

;将COUNT的值赋给R0

LDR       R1,=COUNT

LDR       R0,[R1]

LDR       R1,=COUNT这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条DCD伪指令。

LDR 的两种用法
1)LDR pc, =MyHandleIRQ 表示将MyHandleIRQ符号放入pc寄存器中
2)LDR PC,MyHandleIRQ 表示将读取存储器中MyHandleIRQ符号所表示的地址中的值,及需要多读一次存储器。
 
在代码中:
start:
        ldr pc,=MyHandleReset   @jump to HandleReset
        ldr pc,=MyHandleUndef   @jump to HandleUndef
        ldr pc,=MyHandleSWI     @jump to HandleSWI
        ldr pc,=MyHandleIabort  @jump to HandleIabort
        ldr pc,=MyHandleDabort  @jump to HandleDabort
        nop
        ldr pc,=MyHandleIRQ     @jump to HandleIRQ             <=之前出错的一行
        ldr pc,=MyHandleFIQ     @jump to HandleFIQ
 
@MyHandleIRQ:   .word OS_CPU_IRQ_ISR
MyHandleIRQ:
        sub lr, lr, #4          @ to calculate the return address       
        stmdb sp!, {r0-r12,lr}
        ldr lr, =int_return     @ restore the return address
        ldr pc, =int_handle     @ call for the interrupt handler
在“之前出错的一行”处,如果改成“ldr pc,MyHandleIRQ”当中断来临时,无法进行中断处理。
 
另一种情况是正确的,注意体会:
start:
        ldr pc,=MyHandleReset   @jump to HandleReset
        ldr pc,=MyHandleUndef   @jump to HandleUndef
        ldr pc,=MyHandleSWI     @jump to HandleSWI
        ldr pc,=MyHandleIabort  @jump to HandleIabort
        ldr pc,=MyHandleDabort  @jump to HandleDabort
        nop
        ldr pc,MyHandleIRQ     @jump to HandleIRQ             <=之前出错的一行
        ldr pc,=MyHandleFIQ     @jump to HandleFIQ
 
MyHandleIRQ:   .word OS_CPU_IRQ_ISR
@MyHandleIRQ:
@        sub lr, lr, #4          @ to calculate the return address       
@        stmdb sp!, {r0-r12,lr}
@        ldr lr, =int_return     @ restore the return address
@        ldr pc, =int_handle     @ call for the interrupt handler
因为当中断来临时,还需要去MyHandleIRQ处把OS_CPU_IRQ_ISR取出,即多取一次存储器。
0
0
查看评论

ARM LDR伪指令用法详解

LDR伪指令 10.45 LDR pseudo-instruction           功能:把一个32位立即数或一个32位的内存地址加载到一个寄存器中。    ...
  • ASMARM
  • ASMARM
  • 2014-06-09 09:31
  • 2552

说说ARM汇编的LDR伪指令

我们知道ARM CPU中有一条被广泛使用的指令LDR,它主要是用来从存储器(确切地说是地址空间)中装载数据到通用寄存器。但不论是ARMASM还是GNU ARM AS,都提供了一条与之同名的伪指令LDR,而在实际中使用该伪指令的情况也较多,那他们有什么不同呢?下面我谈谈我的理解。  ...
  • axx1611
  • axx1611
  • 2008-04-27 17:20
  • 21250

MOV指令、LDR指令、LDR伪指令之间的区别

1、MOV指令 MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。  立即数相当于高级语言中的常量(常数), 立即数就是数字嘛,表示数值的数字, 存储器用的是地址,一般立即数前需要加#, MOV对于立即数是有要求的,就是下面的“8位图”数...
  • qingkongyeyue
  • qingkongyeyue
  • 2016-08-18 11:36
  • 1683

ldr和ldr伪指令

ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。 LDR伪指令的形式是“LDR Rn,=expr”。下面举一个例子来说明它的用法。 COUNT EQU       0x40003100 …… LDR...
  • L1259863243
  • L1259863243
  • 2017-01-03 19:56
  • 273

ARM汇编中ldr伪指令和ldr指令

ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如: ldr r0, 0x12345678      就是把0x12345678这个地址中的值存放到r0...
  • IOT_AI
  • IOT_AI
  • 2017-03-07 10:04
  • 172

ldr加载指令,ldr伪指令

转载于http://www.cnblogs.com/hnrainll/archive/2011/06/14/2080241.html 一、ldr作为加载指令 (1)格式为:LDR{条件}  目的寄存器, (2)LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用...
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017-05-10 16:10
  • 291

在ARM汇编中如何区分LDR是指令还是伪指令

由于ARM汇编中,LDR指令和LDR伪指令的指令zhu
  • ASMARM
  • ASMARM
  • 2014-05-29 07:51
  • 1534

LDR与ADR区别(转)

LDR与ADR区别(转) 在资料中,ADR的定义为:小范围的地址读取伪指令,ADR指令将基于PC相对偏移的地址值读取到寄存器中,在编译源程序时ADR伪指令被编译器替换成一 条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,...
  • zhangwenjianqin
  • zhangwenjianqin
  • 2012-06-25 16:33
  • 2478

ARM异常向量表中LDR指令、LDR伪指令的来龙去脉

1、问题引出 在ARM开发中,异常向量表(或者称为中断向量表)处在一个关键的位置,因为它控制了ARM芯片复位时的跳转地址,也即是调到哪里去执行启动代码。一般来说,异常向量表的形式如下 Vector: LDR pc, =resetHandler ; Reset ...
  • a747lulu747
  • a747lulu747
  • 2013-08-01 12:51
  • 1351

ADR与LDR伪指令

在学习ARM指令时,经常会对adr和ldr这两个命令产生疑惑,那他们究竟有什么区别呢?其实这两个都是伪指令:adr是小范围的地址读取伪指令,相于PC 寄存器或其它寄存器的小范围转移;ldr是大范围的读取地址伪指令,相当于PC 寄存器或其它寄存器的长转移。 看下面的例子:   ...
  • coder9999
  • coder9999
  • 2012-05-26 17:58
  • 269
    个人资料
    • 访问:13164次
    • 积分:214
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:41篇
    • 译文:0篇
    • 评论:0条
    文章分类