arm汇编—ldr加载指令,ldr伪指令

发布者:qq8174350最新更新时间:2016-06-21 来源: eefocus关键字:arm汇编  ldr加载指令  ldr伪指令 手机看文章 扫描二维码
随时随地手机看文章
1,ldr加载指令

LDR指令的格式为:
LDR{条件}  目的寄存器,<存储器地址>
LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器
中读取32位的字数据到通用寄存器,然后对数据迕行处理。当程序计数器PC作为目的寄存器时,
指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设
计中比较常用,丏寻址方式灵活多样,请读者认真掌握。
指令示例:
LDR R0,[R1]         ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2]  ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8]   ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2]!;将存储器地址为R1+R2的字数据读入寄存器R0,幵将新地址R1+R2写入R1。
LDR R0,[R1,#8]!  ;将存储器地址为R1+8的字数据读入寄存器R0,幵将新地址R1+8写入R1。 
LDR R0,[R1],R2  ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]!  ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2  ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2×4写入R1。”

ARM是RISC结构,数据从内存到CPU乊间的移劢叧能通过L/S指令来完成,也就是ldr/str指令。  
比如想把数据从内存中某处读取到寄存器中,叧能使用ldr 
比如: 
ldr r0, 0x12345678 
就是把0x12345678返个地址中的值存放到r0中。

2,ldr伪指令
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。
LDR伪指令的形式是“LDR Rn,=expr”。

例子:
COUNT EQU       0x43100
……
LDR       R1,=COUNT
MOV      R0,#0
STR       R0,[R1]

COUNT是我们定义的一个变量,地址为0x43100。这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。
LDR       R1,=COUNT是将COUNT这个变量的地址,也就是0x43100放到R1中。
MOV      R0,#0是将立即数0放到R0中。最后一句STR      R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就是将0放到地址为0x43100的存储单元中去。可 见这三条指令是为了完成对变量COUNT赋值。用三条指令来完成对一个变量的赋值,看起来有点不太舒服。这可能跟ARM的采用RISC有关。

下面还有一个例子
;将COUNT的值赋给R0
LDR       R1,=COUNT
LDR       R0,[R1]
LDR       R1,=COUNT这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条DCD伪指令。

2,LDR 的两种用法
1)LDR pc, =MyHandleIRQ 表示将MyHandleIRQ符号放入pc寄存器中
2)LDR PC,MyHandleIRQ 表示将读取存储器中MyHandleIRQ符号所表示的地址中的值,及需要多读一次存储器。
 
在代码中:
start:
        ldr pc,=MyHandleReset   @jump to HandleReset
        ldr pc,=MyHandleUndef   @jump to HandleUndef
        ldr pc,=MyHandleSWI     @jump to HandleSWI
        ldr pc,=MyHandleIabort  @jump to HandleIabort
        ldr pc,=MyHandleDabort  @jump to HandleDabort
        nop
        ldr pc,=MyHandleIRQ     @jump to HandleIRQ             <=之前出错的一行
        ldr pc,=MyHandleFIQ     @jump to HandleFIQ
 
@MyHandleIRQ:   .word OS_CPU_IRQ_ISR
MyHandleIRQ:
        sub lr, lr, #4          @ to calculate the return address       
        stmdb sp!, {r0-r12,lr}
        ldr lr, =int_return     @ restore the return address
        ldr pc, =int_handle     @ call for the interrupt handler
在“之前出错的一行”处,如果改成“ldr pc,MyHandleIRQ”当中断来临时,无法进行中断处理。
 
另一种情况是正确的,注意体会:
start:
        ldr pc,=MyHandleReset   @jump to HandleReset
        ldr pc,=MyHandleUndef   @jump to HandleUndef
        ldr pc,=MyHandleSWI     @jump to HandleSWI
        ldr pc,=MyHandleIabort  @jump to HandleIabort
        ldr pc,=MyHandleDabort  @jump to HandleDabort
        nop
        ldr pc,MyHandleIRQ     @jump to HandleIRQ             <=之前出错的一行
        ldr pc,=MyHandleFIQ     @jump to HandleFIQ
 
MyHandleIRQ:   .word OS_CPU_IRQ_ISR
@MyHandleIRQ:
@        sub lr, lr, #4          @ to calculate the return address       
@        stmdb sp!, {r0-r12,lr}
@        ldr lr, =int_return     @ restore the return address
@        ldr pc, =int_handle     @ call for the interrupt handler
因为当中断来临时,还需要去MyHandleIRQ处把OS_CPU_IRQ_ISR取出,即多取一次存储器。

关键字:arm汇编  ldr加载指令  ldr伪指令 引用地址:arm汇编—ldr加载指令,ldr伪指令

上一篇:ARM 汇编 LDR STR MOV
下一篇:Arm汇编 位置无关代码 adr 指令

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

arm汇编学习(四)
一、android jni实现 1.静态实现jni:先由Java得到本地方法的声明,然后再通过JNI实现该声明方法。 2.动态实现jni:先通过JNI重载JNI_OnLoad()实现本地方法,然后直接在Java中调用本地方法。 采用静态实现的方式,如果没有进行加密处理,很容易就在IDA导出函数搜到 采用动态实现的方式,还能起到一定的隐藏作用,导出的部分不是就能直接看到java层调的函数名,而是绑定的函数名 native层: 在JNI_OnLoad注册相关函数 JNIEXPORT jstring JNICALL native_hello(JNIEnv *env, jclass clazz) { return (*env)- N
[单片机]
ARM汇编伪指令 宏的用法详解
宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令。 MACRO、MEND 语法格式: MACRO macroname{ $ parameter1, $ parameter, } 指令序列 MEND MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束。用MACRO及MEND定义一段代码,称为宏定义体,这样在程序中就可以通过宏指令多次调用该代码段。 其中, $ label在宏指令被展开时,label会被替换成相应的符号,通常是
[单片机]
影响CPSR状态寄存器的ARM汇编指令总结
最近学习了ARM寄存器寻址方式和ARM指令,现在总结如下: 1、影响CPSR状态寄存器的ARM汇编指令 (1)、带S的指令有 MOVS-- 数据传送指令(只能用在寄存器和寄存器之间) MVNS-- 数据传送指令(和mov区别是,不仅进行数据传输,还进行数据取反) ADDS-- 加法指令 SUBS-- 减法指令 MULS-- 乘法指令 ANDS-- 逻辑与指令(相同是1,不同是0,区别 按位与TST 指令) ORRS-- 逻辑或指令(不同是0,相同是1,区别 按位与TST 指令) BICS-- 设置某一位为1 (2)、另外两个指令 CMP-- 比较指令 TST-- 安位与指令
[单片机]
影响CPSR状态寄存器的<font color='red'>ARM汇编</font><font color='red'>指令</font>总结
ARM汇编语言程序中常用的符号
在汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定: — 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。 — 符号在其作用范围内必须唯一。 — 自定义的符号名不能与系统的保留字相同。 — 符号名不应与指令或伪指令同名。 1、 程序中的变量 程序中的变量是指其值在程序的运行过程中可以改变的量。 ARM ( Thumb )汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。 数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。 逻辑变量用于在程序的运行中保存
[单片机]
ARM汇编语言(4) 指令、伪操作、伪指令学习
LDR指令与LDR伪指令的4种形式: LDR R0, :指令,将R1指向的内存地址存放的内容加载到R0中; LDR R0,LABEL:指令,将标号LABEL所代表的内存地址处存放的内容加载到R0中; LDR R0,=10000:伪指令,将常熟10000赋予R0,采用LDR指令+文字池的方式实现; LDR R0,=LABEL:伪指令,将标号LABEL所代表的内存地址赋予R0; 指令部分: 伪操作部分: 符号定义伪操作:定义变量,对变量进行赋值,定义寄存器名称 GBLA:全局的算术变量,初始化为0; GBLL:全局的逻辑变量,初始化为{FALSE}; GBLS:全局的串变量,初始化为 ; LCLA:局部的
[单片机]
GNU ARM汇编的.balignl对齐实验
在u-boot的start.s源文件中出现 .balignl 16 0xdeadbeef 语句,这条语句是实现地址对齐的。 .balignl与. align类似,完整的laign语句格式为:.align {alignment} {,fill} {,max} alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节数最大值,如果填充字节数超过max, 不进行对齐。 下面分4种情况进行对比: 1.正常情况 .word 0x12345678 .global _end_vect _end_vect: .balignl 16,0xdeadbeef 此时.balignl位于
[单片机]
GNU <font color='red'>ARM汇编</font>的.balignl对齐实验
基于Android的ARM汇编语言系列之一:ARM汇编语言开篇
章节列表 之一:ARM汇编语言开篇 之二:C/C++程序生成ARM汇编程序的过程分析 之三:ARM汇编语言程序结构 之四:ARM处理器的寻址方式 之五:ARM指令集与Thumb指令集 之六:NEON指令集与VFP指令集 这是博文的开篇文章,这里会先介绍一下ARM处理器的大致分类和作用。 一 ARM处理器与ARM指令集 整个ARM处理器被分为三个部分: Classic Embedded Application Classic被称为经典系列。 ARM1~ARM11一直都以数字来命名,ARM12以后改为用Cortex命名。Cortex有以下几个分类: Cortex-A:广泛用于智能手机、上网本、电子书以及
[单片机]
基于Android的<font color='red'>ARM汇编</font>语言系列之一:<font color='red'>ARM汇编</font>语言开篇
arm汇编之冒泡排序
开始在ADS里面写程序后,发现自己之前对于X86汇编的学习完全归还给了我的老师门。最直接的便是要写一个从小到大的冒泡排序。冒泡排序的思想我想就不用赘述了。以前c语言遍的应该很多了。算法不成问题,可是数据结构知道是数组,可是数组在arm汇编里面该在怎么定义了? 其实,还真感觉又要从零开始了。X86的汇编已经完全归还给了我敬爱的微机原理老师。 网上看到了一个广为流传的冒泡排序,既然写不出来,那就先学习它的精髓,说不定还能为我所用了。 代码详细的看了看。具体翻译如下(arm汇编指令不太熟悉,就当时温习吧): AREA Sort,CODE,READONLY :首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段(于
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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