ARM汇编中LDR与LTORG的关系

发布者:WhisperingWave最新更新时间:2016-05-09 来源: eefocus关键字:ARM汇编  LDR  LTORG 手机看文章 扫描二维码
随时随地手机看文章
看了arm汇编语言语法一个多月了。总算入门了。当然还有很多东西值得继续努力推敲滴。

 

最近对LDR与LTORG有了一些新的认识。

 

LDR是一个比较的指令。作用是从存储器到寄存器的单一数据读取指令。它有19条指令格式。

其中有两条格式为宏指令(macro),格式如下:

1,LDRRd,

2,LDR            Rd,=<32-bit-value>

 

这里重点分析下第二条宏指令。它会被编译器编译成一条指令,把给定的32位数值保存到寄存器Rd.通常这掉指令是LDRRd,[pc,#],这个32位数保存在以地址(pc+开始的一个文字池(literal pool)中。

 

关于指令LDRRd,[pc,#],大家就要复习一下arm汇编的"单寄存器load-store指令的寻址方式"了。这里使用到了它的前变址寻址方式。 pc的值不变,寻找的内存值为mem[pc+offset]。

 

LTORG用于声明一个数据缓冲池,(也称为文字池)的开始。在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时被编译器放于数据缓冲池中。

使用说明:

当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTONG伪操作定义数据缓冲池。通常大的代码段可以使用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面,即下一代码段开始之前,或者END伪操作之前。LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误的将数据缓冲池中的数据当作指令来执行。

 

示例代码:

AREA   Example ,CODE,READONLY;  //声明一个代码段,名称为Example,属性为只读

Start    BL  funcl

    ;code

funcl                                       //子程序

    ;code

    LDR  R1,=0x800               //将0X800加载到R1

    MOV  PC,lr                       //子程序结束

LTORG                                   //定义数据缓冲池

data   SPACE 4200               //从当前开始分配40字节的内存单元并初始化为0

END                                      //程序结束

 

0x800的值被编译器暂时放在了data[0-3]字段中。

关键字:ARM汇编  LDR  LTORG 引用地址:ARM汇编中LDR与LTORG的关系

上一篇:ARM汇编中^、!、cxsf符号和movs等指令使用
下一篇:arm汇编中ldr、str、stm、ldm的用法

推荐阅读最新更新时间:2024-03-16 14:53

ARM汇编必知必会
ARM指令集: ADC 带进位的32位数加法 ADD 32位数相加 AND 32位数的逻辑与 B 在32M空间内的相对跳转指令 BIC 32位数的逻辑位清零 BKPT 断点指令 BL 带链接的相对跳转指令 BLX 带链接的切换跳转 BX 切换跳转 CDP\CDP2 协处理器数据处理操作 CLZ 零计数 CMN 比较两个数的相反数 CMP 32位数比较 EOR 32位逻辑异或 LDC\LDC2 从协处理器取一个或多个32位值 LDM 从内存送多个32位字到ARM寄存器 LDR 从虚拟地址取一个单个的32位值 MCR\MCR2\MCRR 从寄存器送数据到协处理器 MLA 32位乘累加 MOV 传送一个32位数到寄存器 MRC\MRC2
[单片机]
<font color='red'>ARM汇编</font>必知必会
GNU ARM汇编--(十二)arm汇编指令的B真的那么简单吗?
说句题外话,在输入 指令 二字的时候,就想起了google搜索时,提示 令 不能搜索,要我换词汇.如果不能说脏话,我真就无语了. 在前面对具体芯片的各个基本模块做完了学习后,在上一篇小结中自以为已经具备了自己写个bootloader的条件,但其实错了,我还有很多基本的知识不了解.比如编译链接gnu的linker script等等.也有很多地方只懂表面,没有做深入的理解. 在《 GNU ARM汇编--(二)汇编编译链接与运行 》中,仿照网上的例子做了makefile和linker script,在那篇blog的末尾我写道 根据google,做了上面的总结,对GNU ARM汇编有了认识,并且对系统调用软中
[单片机]
GNU <font color='red'>ARM汇编</font>--(十二)<font color='red'>arm汇编</font>指令的B真的那么简单吗?
ARM汇编语言学习笔记(四)汇编语言中,如何调用C文件
一、目的 有时候会想一下,为什么我们要应用这些高级语言了?因为,方便啊。 汇编语言对于机器来说固然是效率很高的,但是我们编写起来其实并没有那么方便,因为他的思路还是更近机器,所以在汇编语言的编写当中,C语言也可以被使用进来,帮助大家更快更好的完成工作。 栈在汇编语言中的设置。 C语言在汇编中的调用。 二、堆栈设置 1、为什么要设置栈 因为,c语言函数需要。(如果你要问为什么需要,因为c语言所有的变量都要有地方放啊) 2、怎么设置栈 解决下面的三个问题,我们就可以成功设置栈啦。 调用者怎么向被调用者传参。 被调用者怎么返回值。 怎么恢复调用函数前的寄存器状态。 寄存器规则 这一篇寄存器规则很清楚的讲解了,我们怎么进入
[单片机]
<font color='red'>ARM汇编</font>语言学习笔记(四)汇编语言中,如何调用C文件
GNU ARM汇编--(十)s3c2440的RTC
RTC 概述 在系统电源关掉时RTC可以在备份电池的支持下来工作.RTC可以使用STRB/LDRB指令传输8bit的BCD值到CPU.数据包括秒,分,时,日期,天,月和年.RTC工作在外部32.768KHz的晶振下,而且有报警功能. 属性 BCD:秒,分,时,日期,天,月和年 闰年产生器 报警功能:报警中断 从power-off模式唤醒 独立的电源管脚(RTCVDD) 为RTOS kernel time tick支持毫秒级的tick. 闰年产生器 闰年产生器通过BCDDATA,BCDMON和BCDYEAR来决定每个月最后一天的日期.一个8bit的计数器只能表示两个BCD码,所以无法决定'
[单片机]
ARM汇编指令集之五——乘法指令与乘加指令
ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。 乘法指令与乘加指令共有以下6条: 1、 MUL指令 MUL指令的格式为: MUL{条件}{S} 目的寄存器,操作数1,操作数2 MUL指令完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数。 指令示例: MUL R0,R1,R2 ;R0 =
[单片机]
arm汇编学习(三)
一、ndk编译android上运行的c程序 新建个hello目录,底下要有jni目录,下面就是Android.mk文件 1.Android.mk文件内容如下: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= hello.c LOCAL_MODULE:= hello LOCAL_FORCE_STATIC_EXECUTABLE := true #LOCAL_STATIC_LIBRARIES := libc #LOCAL_CFLAGS += -Iinclude/dir -DSOMEFLAGS include $(BUILD_EXECUTABLE)
[单片机]
ARM中LDR伪指令与LDR加载指令
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。 LDR伪指令的形式是 LDR Rn,=expr 。下面举一个例子来说明它的用法。 COUNT EQU 0x40003100 LDR R1,=COUNT MOV R0,#0 STR R0, COUNT是我们定义的一个变量,地址为0x40003100。这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。 LDR R1,=COUNT是将COUNT这个变量的地址,也就是0x40003100放到R1中。 MOV R0,#0是将立即数0放到R0中。最后一句STR
[单片机]
ARM汇编外部中断
主要是中断向量表的设置和现场保护。 调试比较久的原因:使用main: b main时调试发现,不能死循环,可能是main标签是保留的 1)在主程序中的步骤一般是: 1.关中断,并设置各主要模式的堆栈指针和容量 2写1清SRCPND,INTPND寄存器 3.配置INTMSK使能相应中断 4.开全局中断 3)中断服务程序中的流程是: 1.屏蔽中断(硬件自动关irq中断) 2.执行任务 3.写1清相应SRPND,INTPND等寄存器(可以利用SRPND=SRPND,INTPND来清零,防止出错) 4.把屏蔽的中断使能回来 5.返回 参考u-boot的start.S自己写了一个外部中断程序,mini2440的按键K1
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved