zoukankan      html  css  js  c++  java
  • ARM LDR伪指令使用方法具体解释

    LDR伪指令

    10.45 LDR pseudo-instruction


              功能:把一个32位马上数或一个32位的内存地址载入到一个寄存器中。

              注意:这里描写叙述的是LDR伪指令,而不是LDR指令


               语法:                 

                  LDR{cond}{.W} Rt, =expr
                  LDR{cond}{.W} Rt, =label_expr

                                    *   cond是一个可选的条件码

                                    *  .W是可选的指令宽度说明符

                                    *   Rt是要载入的寄存器

                                    *   expr是一个数字表达式

                                    *   label_expr是一个以标号加上或减去一个数字值形式出现的PC相对或外部地址表达式

               举例:

               

                使用方法:

                         当使用LDR伪指令时:

                          *  假设表达式expr的值能用一个MOV或MVN指令进行载入,那么汇编器就使用MOV或MVN指令。

                          *  假设不能使用MOV或MVN指令,或者使用了label_expr,汇编器就把这个常量放在文字池里,

                             然后使用一条PC相对形式的LDR指令从文字池里读取这个常量。

                             注意:

                              --- 以这样的方式载入的内存地址,其值是在链接时确定的,所以这里的代码不是位置独立的。

                              --- 无论链接器把包括LDR指令的节放在哪里,指向常量的地址仍然是有效的。

                          

                         汇编器把label_expr的值放到一个文字池里,然后使用一条PC相对形式的LDR指令把这个值

                         从文 字池里读取到寄存器里。


                          假设label_expr是一个外部表达式,或不在当前节中,汇编器就在目标文件里放置一个重定位

                          指示符。链接器在链接时会产生详细的地址。


                           假设label_expr是一个局部的命名的(named)或数字标号,那么汇编器在目标文件里放置

                           一个 重定位指示符,同一时候为这个局部标号产生一个符号名。详细的地址也是在链接时产生的。假设

                           这个局部标号引用的是Thumb代码,则内存地址的Thumb位(bit 0)就会被设置。


                           从PC到内存池中常量值之间偏移量在ARM及32位Thumb编码中必须在 ±4K字节内,在16位Thumb

                           编码中必须在0到+1K字节范围 内。你必须自己确保在上述有效范围内有一个内存池。


                            假设被引用的标号是在Thumb代码中,那么LDR伪指令设置label_expr所代表的内存地址的

                            Thumb位(bit 0)。

                            注意:

                在RealView Compilation Tools(RVCT) v2.2中,内存地址的Thumb位不会被设置。假设你有

                                 依赖于这样的行为的代码,请使用命令行选项--untyped_local_labels,强制汇编器不要设置被

                                 引用的位于Thumb代码中的标号。


    Thumb代码中的LDR伪指令

    LDR in Thumb code

              你能够使用指令宽度说明符 .W 强制汇编器在ARMv6T2及以上的处理器上把Thumb代码中LDR

                      伪指令编码为32位长。即使马上数的值能使用一个16位的MOV指令载入,或存在一个在16位PC相

                      对LDR指令范围内的内存池,LDR.W总是产生一条32位的指令。


          未完待续。。。















  • 相关阅读:
    Mongoexport导出数据,Mongoimport导入数据,mongodump备份数据,mongorestore恢复恢复
    php7中使用mongodb的驱动
    windows(X64)+apche2.4+php7.2下安装mongodb
    windows(X64)下安装apche2.4+php7.2+mysql5.7
    Django2.0 path与Django1.x版本url正则匹配问题
    Django: ImportError: No module named 'corsheaders'
    linux开启端口
    MySQL 存储过程传参数实现where id in(1,2,3,...)示例
    ubuntu安装pip3
    在Ubuntu 16.04 安装python3.6 环境并设置为默认
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3829056.html
Copyright © 2011-2022 走看看