• 001_ARM学习_六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM


    以下内容为转载:
    注:非常感谢博主“希望之光”,文章转自他的博客:http://blog.chinaunix.net/uid-20379123-id-1956584.html
     
    ARM的六大类指令集---LDR、LDRB、LDRH、STR、STRB、STRH
     
    ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:
     
    —  LDR     字数据加载指令
     
    — LDRB    字节数据加载指令
     
    —  LDRH    半字数据加载指令
     
    —  STR     字数据存储指令
     
    —  STRB    字节数据存储指令
     
    —  STRH    半字数据存储指令
     
    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+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
     
    LDR   R0,[R1,#8] !          ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。
     
    LDR   R0,[R1],R2              ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。
     
    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。
     
    2、LDRB指令
     
    LDRB指令的格式为:
     
    LDR{条件}B 目的寄存器,<存储器地址>
     
    LDRB指令用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
     
    指令示例:
     
    LDRB R0,[R1]         ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。
     
    LDRB R0,[R1,#8]    ;将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。
     
    3、LDRH指令
     
    LDRH指令的格式为:
     
    LDR{条件}H 目的寄存器,<存储器地址>
     
    LDRH指令用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
     
    指令示例:
     
    LDRH R0,[R1]         ;将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。
     
    LDRH R0,[R1,#8]    ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。
     
    LDRH R0,[R1,R2]    ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。
     
    4、LDM指令:
     
    L的含义仍然是LOAD,即是Load from memory into register。
     
    虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:
     
    LDMFD     SP! ,   {R0, R1, R2}
     
    实际上可以理解为:    LDMFD     [SP]!,    {R0, R1, R2}
     
    意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去。
     
     
    5、STR指令
     
    STR指令的格式为:
     
    STR{条件} 源寄存器,<存储器地址>
     
    STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。
     
    指令示例:
     
    STR   R0,[R1],#8    ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
     
    STR   R0,[R1,#8]    ;将R0中的字数据写入以R1+8为地址的存储器中。
     
    6、STRB指令
     
    STRB指令的格式为:
     
    STR{条件}B 源寄存器,<存储器地址>
     
    STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。
     
    指令示例:
     
    STRB R0,[R1]         ;将寄存器R0中的字节数据写入以R1为地址的存储器中。
     
    STRB R0,[R1,#8]    ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。
     
    7、STRH指令
     
    STRH指令的格式为:
     
    STR{条件}H 源寄存器,<存储器地址>
     
    STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。
     
    指令示例:
     
    STRH R0,[R1]         ;将寄存器R0中的半字数据写入以R1为地址的存储器中。
     
    STRH R0,[R1,#8]    ;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。
     
     
    8、STM指令:
     
    S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。
     
       STMFD      SP!,   {R0}
     
    同样的,该指令也可理解为:  STMFD      [SP]!,   {R0}
     
    意思是:把R0保存到堆栈(sp指向的地址)中。

     

  • 相关阅读:
    android编译全过程
    Android APK反编译得到Java源代码和资源文件
    获取Android的Java源代码并在Eclipse中关联查看的最新方法《转载》
    定制ROM,添加apk文件报错。
    Ubuntu下下载编译android源码
    poj 2714 Random Walk
    hdu 3829 Cat VS Dog
    第九场组队赛总结
    2012 MUTC 9 总结
    hdu 1100 Trees Made to Order
  • 原文地址:https://www.cnblogs.com/luxiaoguogege/p/9690107.html
Copyright © 2020-2023  润新知