2018年6月23日 下午4:28
【这篇文章理解的不正确,看下面新写的文章,这篇文章就当留恋了】
参看:
首先要理解这两节的pdf:
- 这篇文章主要是为了介绍一些基础知识
- 点亮LED的步骤:也是操作arm的一般步骤
- 两种启动过程
- 操作GPF4的方法
- 几条汇编代码
- 机器码
- 快速转换2/8/16进制
- 字节序
- 位操作

重定向
- 重定向是在main函数已经完成的情况下,处理如何合适的链接在内存中存储代码。
回答几个核心的问题:
- 这章运行时地址是最重要的,从他的名字来判断,作用是:程序的运行地址设置在哪里,那么我们的程序就应该保存在那里,然后从这里运行。
- 那么为啥还要出现加载地址?
- 现在见的最多的就是要为了更改bin文件的大小
- 如果一个程序运行时地址和加载地址不同怎么办?
- 首先要说明,我们在反汇编文件dls中,最左边的一列看到的是加载地址,但是最最重要的是:当我们将程序烧到nor/nand之后,只有第二列的机器码被烧了进去。加载地址是为了你阅读方便而存在的,不烧到内存中
- 而,烧到内存中的代码,其中涉及到地址的部分,是根据运行时地址来跳转或寻找的,也与加载地址无关。这个是隐形的!
- 总结:其实我们可以忽略加载地址的存在,认为只有运行地址
- 2018年11月22日 下午1:24
- 可以认为运行地址 比 加载地址高一个层次,是给人看的。

- 如果使用相对地址指令=>此时只能看到运行时地址
- 如果使用绝对地址指令<=>此时只能看到加载地址
- 一共有四个地址!!!!
- 可以认为运行地址 比 加载地址高一个层次,是给人看的。
- 我们很多时候是不可能做到代码一定就在运行地址处执行,那怎么办?
- 例如,刚刚烧到nor/nand的时候,是一定从0地址处开始执行的,此时,我们的运行地址一般都不从0开始
- 写位置无关码?
- rodate,date段的全局/静态变量,必须使用绝对地址来查找(没为啥,arm规定)。那么,当程序不在运行地址处执行时,我们一定不可使用全局变量
- 已赋值的数组中的值会保存在rodate段,即使数组本身是局部变量,应该在栈中,但是我们依然不可使用以赋值的数组。
- 使用相对跳转指令b/bl,不可使用ldr