zoukankan      html  css  js  c++  java
  • (转)伪指令LTORG和LTONG浅析

    原文地址:http://zqwt.012.blog.163.com/blog/static/1204468420103196564/

     

    定义和作用

    LTORG或LTONG用于声明一个数据缓冲池(也称为文字池)的开始。即在此指令出现的地方放一个数据缓冲池(literal pool)。

     

    什么时候使用

    在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池。

     

    使用说明

    当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTONG伪操作定义数据缓冲池。

    通常大的代码段可以使用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面,即下一代码段开始之前,或者END伪操作之前。

    LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误的将数据缓冲池中的数据当作指令来执行。

    LDR伪指令在汇编时,如果立即数可以用<shifter_operand>表示的话,编译器将尽可能把LDR替换为MOV或MVN指令;如果不能替换,则需要将该立即数放到一个文字池中,并生成一条将该文字池内容加载到目标寄存器的LDR指令。

    而使用LDR指令必须保证文字池的位置在其可以访问的地址范围之内,对于ARM指令集来说就是4KB,如果偏移地址大于4k空间,LDR指令会出错(因为LDR的相对偏移地址为12-bit的值)。所以必须在LDR指令前后4KB的范围内用LTORG显式地在代码段中添加一个文字池。

     

    例:

    ldr   r0, =instruction     @ 将地址instruction载入r0.

     

    此时编译器将ldr尽可能的转变成MOV或MVN指令。

    如果转变失败,将产生一个LDR指令,通过PC相对地址从一块保存常数的内存区读出instruction的值。此内存区即是文本池。

  • 相关阅读:
    数学概念的提出与演化
    数学概念的提出与演化
    常见信号的模拟仿真(matlab)(spike signal)
    常见信号的模拟仿真(matlab)(spike signal)
    广告转化率预估算法研究
    广告转化率预估算法研究
    傅里叶分析(matlab)
    傅里叶分析(matlab)
    安装Windows SDK7.1时发生的一个错误(附解决办法)
    POJ 3080 Blue Jeans (KMP)
  • 原文地址:https://www.cnblogs.com/sheshiji/p/3623672.html
Copyright © 2011-2022 走看看