LTORG用于声明一个数据缓冲池,(也称为文字池)的开始。在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池。
语法LTORG
使用说明:
当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTONG伪操作定义数据缓冲池。通常大的代码段可以使用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面,即下一代码段开始之前,或者END伪操作之前。LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误的将数据缓冲池中的数据当作指令来执行。
LDR伪指令在汇编时,如果立即数可以用表示的话就替换为MOV或MVN指令;如果不能用其表示则需要将该立即数放到一个文字池中,并生成一条将该文字池内容加载到目标寄存器的LDR指令。而使用LDR指令必须保证文字池在其可以访问的地址范围之内,对于ARM指令集来说就是4KB,所以必须在LDR指令前后4KB的范围内用LTORG显式地在代码段中添加一个文字池。
LTORG是在此指令出现的地方放一个文本池(literal pool).在ARM汇编中常用到
ldr r0, =instruction将地址instruction载入r0.
此时编译器将ldr尽可能的转变成mov或mvn指令。
如果转变不成,将产生一个ldr指令,通过pc相对地址从一块保存常数的内存区读出instruction的值。此内存区既是文本池。一般的,文本池放在END指令之后的地方。但是,如果偏移地址大于4k空间, ldr指令会出错(因为ldr的相对偏移地址为12-bit的值).此时使用LTORG放到会出错的ldr指令附近,以解决此问题。编译器会收集没有分配的ldr的值放到此文本池中。
关键字:ARM汇编 伪指令 LTORG
引用地址:
ARM汇编----伪指令LTORG
推荐阅读最新更新时间:2024-03-16 14:32
ARM汇编和内嵌汇编
一、ldr的确是个复杂的指令,现总结一下: 首先要判断我们用的是ldr arm指令还是伪指令。 当我们用的是arm指令时,它的作用不是向寄存器里加载立即数,而是将某个地址里 的内容加载到寄存器。而伪指令ldr的作用就是向寄存器里加载立即数。 (1) ldr伪指令 ldr伪指令的格式是 ldr Rn, =expr 其中,expr是要加载到Rn中的内容,一般可以是立即数或者label。 如果expr可以用8bit数据向右移偶数位得到,那么这条伪指令就被编译器翻译成mov指令。具体的移位情况可以去查阅资料。反之如果立即数很大,超过了12bit
[单片机]
ARM汇编语言中的中括号(“[”和“]”)是什么意思
ARM汇编语言的部分代码如下: GBLA PLLCLK PLLCLK SETA 64000000 请问其中的中括号( )是什么意思? 如果第一句为真,则以下的符号定义有效。 还有另一种方式 意思是如果条件为真,符号定义1有效,否则符号定义2有效
[单片机]
系统学习ARM之四 --GNU的伪指令集
转载自http://blog.csdn.net/qqliyunpeng/article/details/48791487 一、伪指令 的含义: 伪指令是编译器支持的指令,不是硬件芯片支持的指令。 编译器在编译时,会把伪指令转化对应的芯片支持的指令。 伪指令集包括:伪操作和伪指令 二、伪操作: 1. 数据定义(Data Definition)伪操作: 数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。 常见的数据定义伪操作有如下几种: .byte 单字节定义 .byte 0x12,’a’,23 .short
[单片机]
arm汇编adrl以及ldr与adr的区别
看《嵌入式linux应用开发》第六章实例中看到个句: adrl r2,men_cfg_val 最初对adr1相当不解,后来发现,那个不是数字1,而是字母l(认真看头部,有点区别的) 这里记录下ADRL的用法: 功能:将相对于程序或相对于寄存器的地址载入寄存器中。 与 ADR 指令相似。ADRL 生成两个数据处理指令,因此它比 ADR 加载的地址范围要宽。 语法 ADRL{cond} Rd,label 其中: cond:是一个可选的条件代码。Rd:是要加载的寄存器。label:是相对于程序或寄存器的表达式。 上面给出的范围是相对于位于当前指令地址后的、距离当前指令四个字节(在 Thumb 代码中)或两
[单片机]
C语言和ARM汇编混合编程实现阶乘运算
1.阶乘运算必须用汇编语言实现; 2. 通过C语言调用阶乘运算结果并显示出来。 (1) 用汇编语言编写阶乘运算子程序,命名为zmc.s; 程序如下: AREA asmfile,CODE,READONLY EXPORT asmDouble asmDouble sub R1,R0,#1 cmp R1,#00 BEQ L2 L1 mul R2,R0,R1 sub R1,R1,#1 mov R0,R2 cmp R1,#00 BNE L1 L2 mov pc, lr END (2) 将其添加到半主机程序中的SYS中; (3) 将半主机程序的main修改如下: #inclu
[单片机]
内核汇编基础——ARM汇编指令详解
ARM 的编程模式和七种模式 【文章福利 】小编推荐自己的Linux内核源码交流群:【点击链接加入群聊 869634926 】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前50名可进群领取,并额外赠送一份价值798的内核资料包(含视频教程、电子书、实战项目及代码)! 点击下方链接即可免费领取内核相关学习资料哦 学习直通车: Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈 内核资料领取: Linux内核源码技术学习路线+视频教程内核源码 基本设定 架构 (32位) 约定 Byte(字节):8bits Halfword(半字) :16
[单片机]
ARM汇编语言入门(五)
Part 5:加载和存储多个值 有时你想要更有效率,一次加载(或存储)多个值。为此我们可以使用LDM(load multiple)和STM(stroe multiple)指令。这些指令有各种变体,基本上只因访问初始地址的方式而异。这是我们本节将要使用的代码,将一步步地认识这些指令。 .data array_buff: .word 0x00000000 /* array_buff */ .word 0x00000000 /* array_buff */ .word 0x00000000 /* array_buff . 此处是一个相对地址,等于array_buff+8 */ .word
[单片机]
ARM汇编:加载和存储指令集(六大类)
ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下: — LDR 字数据加载指令 — LDRB 字节数据加载指令 — LDRH 半字数据加载指令 — STR 字数据存储指令 — STRB 字节数据存储指令 — STRH 半字数据存储指令 1、LDR指令 LDR指令的格式为: LDR{条件} 目的寄存器, 存储器地址 LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄
[单片机]