博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
arm 裸机学习笔记
阅读量:5091 次
发布时间:2019-06-13

本文共 1054 字,大约阅读时间需要 3 分钟。

位置无关码

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

posted on
2019-09-15 22:23  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/ramlife/p/11524688.html

你可能感兴趣的文章
设计模式的饕餮盛宴
查看>>
Swift编程语言的相关资料
查看>>
python数据类型之int用法
查看>>
selenium模拟鼠标操作
查看>>
第九章 操作系统
查看>>
尽量用类型化的常量替代预处理器的 #DEFINE 方法
查看>>
CSS教程布局之道
查看>>
Mac系统常用快捷键及技巧
查看>>
28.广搜:被围住的面积
查看>>
jQuery 图片轮播的代码分离
查看>>
疯狂,千人抢“幸福”,引微博万人围观
查看>>
vue中 父子组件的通讯
查看>>
GridView如何实现双击行进行编辑,更新
查看>>
LINUX 命令行编辑快捷键
查看>>
redis持久化RDB与AOF
查看>>
信息化基础建设 开发框架
查看>>
讲给普通人听的分布式数据存储【转载】
查看>>
ASIHTTPRequest是什么?
查看>>
将博客搬至CSDN
查看>>
数据结构:散列函数的构造方法
查看>>