arm 汇编伪指令与位置相关代码

发布者:雅致小筑最新更新时间:2022-07-29 来源: csdn关键字:arm  汇编  伪指令 手机看文章 扫描二维码
随时随地手机看文章

位置相关和位置无关主要体现在程序运行时的地址和编译时指定的代码段的地址是否为同一地址


编译环境:ADS1.2


开发板:GEC210(s5pv210soc)


程序运行方式:使用uboot的tftp下载bin文件到内存(0x30008000),然后运行


          汇编代码如下:


          ldr r3,=delay                     1

          ldr r3,delay                       2

          adr r3,delay                      3


         。。。。。


delay


        mov r2,#0xff00000


       .......


         end


在ADS中设置入口地址为0x30008000(ARM linker选项中的RO base)


在AXD中查看到反汇编代码如下


30008000    [0xe59f3040]   ldr      r3,0x30008048 ; = #0x30008038

30008004    [0xe59f302c]   ldr      r3,delay ; = #delay

30008008    [0xe28f3028]   add      r3,pc,#0x28 ; #0x30008038


。。。。


30008048    [0x30008038]   dcd      0x30008038  8..0

。。。。



第一列30008000为地址,第二列的中括号中的数字表示相应的机器码,后面的为对应的arm指令。


其中我们看到第一条指令,原指令写为ldr r3,=delay


反汇编的指令变为ldr      r3,0x30008048


相应的机器码为0xe59f3040


我们看机器码的低12bits,其值为0x040。


计算pc+0x40 = 0x30008000 + 8 + 0x40  = 0x30008048


得到新的地址0x30008048,看看0x30008048地址的内容0x30008038


0x30008038为delay标号的地址,从内存单元读取该值


所以看的出ldr r3,=delay 是位置相关的指令(没看懂的接着往下看)


看看另外两条指令


原指令ldr r3,delay


反汇编指令ldr      r3,delay


机器指令0xe59f302c


保留机器指令的最低12bits为0x02c


计算PC+0x02c = 0x30008004+8+0x02c = 0x30008038


0x30008038为delay标号的地址,这个地址是与pc的值相加算出来的。


而前面那条指令的这个值是保存在某个单元,然后用指令读出来的。


这个值(0x30008038)是算出来的与pc相关,是根据pc的值算出来的,而第一条指令的那个地址是读出来的,是个确定值,与pc无关。


第三条指令  adr r3,delay


反汇编 add      r3,pc,#0x28


直接看的出r3的值与pc加上某个数得到的。


以上指令可以看出来,与pc相关的值那么就是位置无关指令,与pc无关的代码就是位置有关的指令。


未完,继续


两种情况


1.我把编译出来的bin文件下载到0x30008000这个位置,3条指令都能正确获取数据


2.我把bin文件下载到 0x30001000(或者其他可用内存地址),那么第一条指令不能获取正确数据,2,3条可以获取正确数据。


此时pc的值应该为0x30001000+8 = 0x30001008;


第一条指令计算的地址为0x30001048,这个地址有一个数据0x30008038,指令想再间接访问0x30008038读取一个值出来时,明显会出错,实际也不是对应delay标号的地址,delay的地址应该为0x30001038


后面的两条指令都可以计算得到值为0x30001038,就是delay实际的地址了。


以上对位置相关和位置无关进行一个简单说明。如果还是不能理解可以使用ads或者keil之类的调试工具尝试。


简单来说,位置无关就是不管你编译的时候指定的代码段起始地址在哪,而我随便下载到哪个内存空间,程序都能正常运行


而位置有关代码,就是程序编译是指定代码段的位置,程序必须下载到指定位置才能正常运行的代码。


备注:pc的值等于当前正在执行指令的地址+8


关键字:arm  汇编  伪指令 引用地址:arm 汇编伪指令与位置相关代码

上一篇:gec210 led裸机开发 汇编指令
下一篇:GEC210 系统更新说明

推荐阅读最新更新时间:2024-11-13 06:47

基于S3C6410的ARM11学习(十二) 代码拷贝及led测试输入日志
之前已经将ddr进行初始化了,这样就可以使用ddr了。首先就要将代码从stepping stone拷贝到ddr中。最后在ddr中运行程序。如果外部nandflash还有剩余的程序,还要将剩下程序拷贝到ddr中。 Stepping stone的起始地址是0x0c000000,DDR的起始地址是0x50000000。在上电的时候,CPU会自动把NANDFLASH的前8K代码拷贝到stepping stone中。但是现在写的代码是比较小的,还没有超过4K。所以这里就设定拷贝的代码是前4K代码。 这样,代码就比较好写了。 R0保存的是stepping stone的起始地址,r1保存的是要拷贝的ddr的地址,这里地址是0x
[单片机]
基于S3C6410的<font color='red'>ARM</font>11学习(十二) 代码拷贝及led测试输入日志
ARM programmer’s Model 学习
ARM中支持字节、半字、字三种数据类型。(V4版本以上,现在的手机芯片低端的基本都是V5版本ARM9) 能表达的数值有2^32个数值。对于有符号数据值在负半轴上有数值,对于无符号数据只在0的右侧有值。具体 范围如下描述 所以数据操作都是一字为单位进行计算。 对于ARM中unbanked 寄存器和banked寄存器的理解: R0 R15是一个虚拟的符号。存在真实的物理寄存器,在不同工作模式下R0 R7对应的(refer to) 物理寄存器是一样的,而banked寄存器在工作模式不同的情况下,对应不同的物理寄存器。
[单片机]
<font color='red'>ARM</font> programmer’s Model 学习
arm中R0-R15寄存器的作用
根据 ARM-thumb 过程调用标准 : r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。 被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。 r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。 r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。 在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。 13 是栈指针 sp。它不能用于任何其它用途。
[单片机]
Arm中国公开信:恳请政府介入 保护战略资产!
作为芯片行业中的明星企业,ARM最近不断被推上风口浪尖,先是经历了中国区的换帅风波,然后总公司又被软银集团待价而沽。 今天,ARM中国区实体“安谋中国”的技术和业务团队发布联名公开信,详细介绍了ARM中国的背景,并公开表达了团队的诉求。 据悉,安谋中国是总部位于深圳的中外合资独立企业法人,前身是ARM在中国的子公司,2018年4月在深圳市政府主导下,由中方投资人与软银集团签约成立,中方控股51%,外方持股49%,中投公司、深业集团、丝路基金、中银国际、招银国际等多家央国企金融机构和知名产业资本参与投资,并分别选派了厚朴投资、安创基金作为中方的投资人代表,以一致行动人身份进入董事会。 合资公司拥有ARM在中国市场永久、独家的产品销售
[机器人]
PIC中档单片机汇编指令详解(2)
DECF 数据寄存器的内容递减1 语法形式:DECF f,d 操作数:f为数据寄存器的低7位地址(0x00~0x7F) d为目的寄存器的低7位地址(0x00~0x7F) 当d=f时,结果放在f数据寄存器,f数据寄存器自减1 当d=W时,结果放在W寄存器中,W寄存器内容自减1 执行时间:一个指令周期 执行过程:【f】-1 d 状态标志影响:Z 说明:该指令对数据寄存器的内容做减1运算。如果减1后的结果为0,则置位0标志寄存器Z 指令范例: CLRF Count ;Count=0x00 DECF Count,f ;Count=0x00,f=0xFF DECF f,W ;f=0xFF,W=0xFE INCF 数据
[单片机]
ARM指令中的"8位图"立即数格式
最近在学习 ARM9 原理和应用设计 一书. 书中在介绍ARM指令格式的时候, 指出: ARM 指令中, 第二个操作数 (operand2) 如果是常数表达式的话, 该常数须对应8位位图 (Pattern), 即常数是由一个8位的常数循环移位偶数位得到的. 如 0x3FC, 0, 200 等是合法常量, 0x1FE, 511 等就是非法常量. 一开始我对这句话不是很明白, 书上举出的例子也没有想通. 于是打算从源头——ARM 指令格式开始研究. 一条典型的 ARM 指令的基本格式是 opcode { cond } {S} Rd , Rn {, operand2 } 共32位. 其中 operand2 占12位. 而在使用立
[单片机]
基于ARM的系统构件优化整个MCU开发周期
为满足应用需求,微控制器对功能性、各种片外片内存储器的类型和密度以及高层次系统集成的需求不断发展。本文提出了对这些需求的应对策略,即开发模块化架构来优化最终用户产品周期的各个方面,包括应用匹配、PCB设计、应用软件开发和产品升级等。 如今,对成本敏感的微控制器市场需要可使产品功能紧密地适合应用的高层次系统集成。PCB尺寸、电源消耗和材料成本的压力也需要比以往更高层次的系统集成。此外,稳压器、电压不足检测器、上电复位等电源接口与晶振/PLL、系统定时器等定时单元一样,都需要在片内得到实现。 为紧密地适合应用,存储器、外围设备与连接之间的正确组合非常重要。对存储器的需求在类型和密度上是不同的。小容量的引导ROM、RAM工作区以及用
[单片机]
基于<font color='red'>ARM</font>的系统构件优化整个MCU开发周期
ARM40-A5应用——fbset与液晶屏参数的适配
在ARM板卡上使用某个型号的LCD,往往要修改LCD驱动程序或者设备树,很不方便。 在ARM40-A5中,我们把常用的LCD型号的配置指令存放在 /etc/init.d/S01user1lcd 文件中,通过修改该文件,即可非常方便的适配不同的LCD。 对于 /etc/init.d/S01user1lcd 文件中未包含的LCD型号,也可通过本文介绍的方法,方便的自行在该文件中添加新的LCD型号。 一、Linux fbset 指令介绍 fbset指令可用于设置framebuffer缓冲区的大小,还能调整画面分辨率,位置,高低宽窄,色彩深度,并可决定是否启动显卡之各项硬件特性。 语法 fbset
[单片机]
<font color='red'>ARM</font>40-A5应用——fbset与液晶屏参数的适配
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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