zoukankan      html  css  js  c++  java
  • ARM学习笔记9——ARM汇编汇编语言中的伪指令

      ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令。ARM伪指令包含ADR、ADRL、MOV32和LDR。
    一、ADR伪指令
      1、作用
        ADR是小范围地址读取伪指令,基于PC相对偏移地址或基于寄存器相对偏移地址读取到寄存器中,当地址值是字节对齐时,取值范围为-255到255,当地址值是字对齐时,取值范围-1020到1020
      2、语法格式
        ADR{<condition>}{.W} register,label
      3、参数说明
        3.1、.W:可选项,指定指令宽度
        3.2、register:目标寄存器
        3.3、label:基于PC或具有寄存器的表达式

    二、ADRL伪指令
      1、作用
        ADRL是中等范围地址读取伪指令,基于PC相对偏移的地址或基于寄存器相对偏移的地址值读取到寄存器中,当地址值是字节对齐时,取值范围为-64KB到64KB,当地址值是字对齐时,取值范围为-256KB到256KB。
      2、语法格式
    ADRL{<condition>} register,label
      3、参数说明
        3.1、register:目标寄存器
        3.2、label:基于PC或具体寄存器的表达式
      4、与ADR的区别
        ADRL伪指令比ADR伪指令可以读取更大范围的地址,这是因为在编译阶段,ADRL伪指令被编译器换成两条指令。如果汇编器不能再两条指令内完成操作,将报告错误,终止编译。

    三、LDR伪指令
      1、作用
        装载一个32位常数和一个地址到寄存器
      2、语法格式
        LDR{<condition>}{.W} register,=[expr|label-expr]
      3、参数说明
        3.1、.W:指定指令宽度
        3.2、register:目标寄存器
        3.3、expr:32位常量表达式,汇编器根据expr的取值情况,对LDR伪指令做如下处理:
          3.3.1、当expr表示的地址值没有超过MOV或MVN指令的地址取值范围时,汇编器用一对MOV和MVN指令代替LDR指令。
          3.3.2、当expr表示的指令地址超过了MOV或MVN指令的地址范围时,汇编器将常量放在数据缓存池,同时用一条基于PC的LDR指令读取该常量。
        3.4、label-expr:一个程序相关或声明为外部的表达式
      4、举例
        将常数0xff0读到r1中
        LDR r3,=0xff0,相当于:MOV r3,#0xff0(注:由于带立即数的指令会因为ARM32位等宽造成指令限制,导致有些情况下用伪指令代替操作立即数的指令,如:MOV r3,0x123,此时会报错“invalid constant (123) after fixup”)

    四、NOP伪指令
      1、作用
        执行一条空操作,多用于延时,该指令一般被替换成如:mov r0,r0这样一条指令
      2、语法格式
        NOP

  • 相关阅读:
    Python基础04 字典基本操作
    Python基础03 列表、元组基本操作
    Python基础02 字符串基本操作
    Python基础07 函数作用域、嵌套函数、闭包函数、高阶函数及装饰器的理解
    Python随机数random模块学习,并实现生成6位验证码
    Python与时间相关的time、datetime模块的使用
    Python PIL库安装
    Python中可变对象和不可变对象
    Mac环境下Docker及Splash的安装运行教程
    redis 链表(list)操作
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3533314.html
Copyright © 2011-2022 走看看