zoukankan      html  css  js  c++  java
  • ARM汇编- LDR加载指令,LDR伪指令

    1,ldr加载指令
    LDR指令的格式为:
    LDR{条件}  目的寄存器,<存储器地址>
    LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器
    中读取32位的字数据到通用寄存器,然后对数据迕行处理。当程序计数器PC作为目的寄存器时,
    指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设
    计中比较常用,丏寻址方式灵活多样,请读者认真掌握。
    指令示例:

    LDR R0,[R1]                                                      ;将存储器地址为R1的字数据读入寄存器R0。

    LDR R0,[R1,R2]                                             ;将存储器地址为R1+R2的字数据读入寄存器R0。

    LDR R0,[R1,#8]                                             ;将存储器地址为R1+8的字数据读入寄存器R0。

    LDR R0,[R1],R2                                               ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2的值存入R1。

    LDR R0,[R1],#8                                               ;将存储器地址为R1的字数据读入寄存器R0,并将R1+8的值存入R1。

    LDR R0,[R1,R2]!                                          ;将存储器地址为R1+R2的字数据读入寄存器R0,并将R1+R2的值存入R1。

    LDR R0,[R1,LSL #3]                                   ;将存储器地址为R1*8的字数据读入寄存器R0。

    LDR R0,[R1,R2,LSL #2]                         ;将存储器地址为R1+R2*4的字数据读入寄存器R0。

    LDR R0,[R1,,R2,LSL #2]!                       ;将存储器地址为R1+R2*4的字数据读入寄存器R0,并将R1+R2*4的值存入R1。

    LDR R0,[R1],R2,LSL #2                            ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2*4的值存入R1。

    LDR R0,Label                                                ;Label为程序标号,Label必须是当前指令的-4~4KB范围内。



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




    2,ldr伪指令
    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伪指令。



    2,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取出,即多取一次存储器。




    参考文件:
    1,http://www.cnblogs.com/hnrainll/archive/2011/06/14/2080241.html

  • 相关阅读:
    甲醛(Formaldehyde)
    Node Embedding
    受限玻尔兹曼机(RBM, Restricted Boltzmann machines)和深度信念网络(DBN, Deep Belief Networks)
    长尾分布,重尾分布(Heavy-tailed Distribution)
    SVD分解与数据压缩
    Batch Normailzation
    Attention Mechanism
    新装的Ubuntu在Nvidia显卡上分辨率不对
    人工神经网络(Artificial Neural Network)
    Xdebug+phpstorm配置
  • 原文地址:https://www.cnblogs.com/yingziLiu/p/5423313.html
Copyright © 2011-2022 走看看