位置无关码

bl 是位置无关码,指令中带的数值是,编译的时候,编译器计算好的,需要跳转的位置减去 bl 指令所在位置的结果。这样当程序最开始在 4k sram 中运行的时候,跳转的位置是在 0 + offset 的位置,当后期sdram 初始化好了之后,程序移动到 sdram 中运行的时候,跳转的位置是 0x30000000 + offset 的位置。

ldr 是位置相关码,指令中的位置是编译好的绝对位置,如果 sdram 中还没有初始化好,跳转的位置是 0x30000000地址以上的值,那就出错了。

如果是 C 语言,想要某些位置无关,那么就不能用全局变量和静态变量。

长距离跳转

b 和 bl 只能前后跳转 32M的范围,想要长距离跳转需要用 ldr pc, =main 这种方式来做。一般从sram 跳转到 sdram 中执行的时候,可以用 ldr 的指令来跳转。
bl 默认lr 是下一条指令,可以直接作为子函数的调用。ldr 只是单纯的跳转,用于调用子函数的时候,必须前面先用一条 ldr lr, =int_return 之类的语句作为返回用的 lr 位置。

链接脚本地址

编译器根据链接脚本中的地址来确定程序中各个部分的地址。链接脚本允许设定一部分放到 0地址开始的地方,一部分放到 0x30000000开始的地方,也可以都放到 0地址开始的地方,或者都放到 0x30000000 开始的地方。这里有好几个需要注意的地方:

  1. 从0地址开始的地方不能超过 4k sram 的大小。
  2. 正常使用 0x30000000 部分内容之前,必须初始化 sdram,才能正常使用。不然一些函数的跳转,全局变量等等都会引发出错。
  3. 如果是使用 0x30000000 部分的代码,并且还没来得及初始化 sdram,就需要跳转或者子函数,那么一定要使用位置无关码进行跳转,否则也会出错。

位置无关配置寄存器

本来可以把配置放到数组里面,然后用 for 循环给寄存器复制。但是如果想用位置无关代码的话,那么最好一个一个直接对寄存器赋值数值。这两种汇编出来后反编译是不一样的。直接赋值,汇编里面是一句句不太一样的数值进行加加减减,最后出来想要的数据并赋值。而使用数组,想要的数值是写死在函数中一小块位置上,数值比较清晰。

arm 裸机学习笔记的更多相关文章

  1. ARM汇编学习笔记

    ARM  RISC  (Reduced Instruction Set Computers) X86   CISC  (Complex Instruction Set Computers)      ...

  2. ARM 汇编学习笔记

  3. JZ2440裸机点亮LED【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 一.我们首先来做第一个实验,用汇编语言点亮板子上的LED. 1.1 LED的原理图 从下面的原理图可知LED1是 ...

  4. JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)

    我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...

  5. 嵌入式Linux学习笔记(0)基础命令。——Arvin

    学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...

  6. Linux学习笔记——基于鸟哥的Linux私房菜

    Linux学习笔记--基于鸟哥的Linux私房菜 ***** ARM与嵌入式linux的入门建议 (1) 学习基本的裸机编程:ARM7或ARM9,理解硬件架构和控制原理 (这一步是绝对的根基) (2) ...

  7. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  8. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  9. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

随机推荐

  1. extract()和extact_first()的区别

    extract()和extact_first()都是提取Selector的data部分.但现在你要先知道什么是Selector. Selector是选择器的意思.具体定义我不知道,但通过下面的例子,你 ...

  2. 1_01_MSSQL课程_基础入门2

    1.数据库的迁移方案 ->分离 附加 ->权限问题: ->启用Administrator账号 ->把数据库文件放到默认的数据库文件存放目录. ->数据库文件兼容级别,设置 ...

  3. Android之Handler消息处理机制

    Handler的作用 Handler消息机制在Android中的应用非常广泛,很多组件的底层实现都是靠Handler来完成的,所以掌握Handler消息机制的原理还是非常重要的.Handler的主要功 ...

  4. python isdigit()函数

    isdigit() 函数是作用于字符串的,用来判断字符串是否全部由数字组成. x = '123456' y = 'iloveyou123' print(x.isdigit(),y.isdigit()) ...

  5. [Luogu][P2458] [SDOI2006]保安站岗

    题目链接 看起来似乎跟最小点覆盖有点像.但区别在于: 最小点覆盖要求所有边在其中,而本题要求所有点在其中. 即:一个点不选时,它的儿子不一定需要全选. 画图理解: 对于这样一幅图,本题中可以这样选择: ...

  6. 003、Java的单行注释

    代码如下: package TIANPAN; public class TestDemo { public static void main(String args[]) { // JAVA的单行注释 ...

  7. UVA 12510/CSU 1119 Collecting Coins DFS

    前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...

  8. [题解] LuoguP5666 树的重心

    这个题......确实是CSPNOIP题qwq 感觉猜到一个性质就差不多了,首先,对于一棵树,随便拎一个节点\(rt\)当根节点,那么他的重心一定在\(rt\)的重儿子里,进一步的,可以发现重心一定在 ...

  9. 不能安装64位office提示已安装32位如何处理

    不能安装64位office提示已安装32位如何处理?   1 2 3 4 5 6 当你遇到提示说[无法安装64位版本的office,以为在您的PC上找一下32位程序......]时如果你还想安装64位 ...

  10. Fedora Workstation 31众多功能得到改进

    导读 周一,Red Hat的桌面高级经理Christian F.K. Schaller分享了一篇博客文章,概述了Fedora Workstation 31的各种改进和特性.这些包括Wayland的改进 ...