0%

回答一个c程序是怎样执行的?

2018年6月23日 下午4:28
【这篇文章理解的不正确,看下面新写的文章,这篇文章就当留恋了】
参看:

首先要理解这两节的pdf:

从C编译到机器指令(八课)

  1. 这篇文章主要是为了介绍一些基础知识
    1. 点亮LED的步骤:也是操作arm的一般步骤
    2. 两种启动过程
    3. 操作GPF4的方法
    4. 几条汇编代码
    5. 机器码
    6. 快速转换2/8/16进制
    7. 字节序
    8. 位操作

      重定向
  2. 重定向是在main函数已经完成的情况下,处理如何合适的链接在内存中存储代码

回答几个核心的问题:

  1. 这章运行时地址是最重要的,从他的名字来判断,作用是:程序的运行地址设置在哪里,那么我们的程序就应该保存在那里,然后从这里运行。
  2. 那么为啥还要出现加载地址
    1. 现在见的最多的就是要为了更改bin文件的大小
  3. 如果一个程序运行时地址加载地址不同怎么办?
    1. 首先要说明,我们在反汇编文件dls中,最左边的一列看到的是加载地址,但是最最重要的是:当我们将程序烧到nor/nand之后,只有第二列的机器码被烧了进去。加载地址是为了你阅读方便而存在的,不烧到内存中
    2. 而,烧到内存中的代码,其中涉及到地址的部分,是根据运行时地址来跳转或寻找的,也与加载地址无关。这个是隐形的!
    3. 总结:其实我们可以忽略加载地址的存在,认为只有运行地址
    4. 2018年11月22日 下午1:24
      1. 可以认为运行地址加载地址高一个层次,是给人看的。
      2. 如果使用相对地址指令=>此时只能看到运行时地址
      3. 如果使用绝对地址指令<=>此时只能看到加载地址
        1. 一共有四个地址!!!!
  4. 我们很多时候是不可能做到代码一定就在运行地址处执行,那怎么办?
    1. 例如,刚刚烧到nor/nand的时候,是一定从0地址处开始执行的,此时,我们的运行地址一般都不从0开始
    2. 写位置无关码?
      1. rodate,date段的全局/静态变量,必须使用绝对地址来查找(没为啥,arm规定)。那么,当程序不在运行地址处执行时,我们一定不可使用全局变量
      2. 已赋值的数组中的值会保存在rodate段,即使数组本身是局部变量,应该在栈中,但是我们依然不可使用以赋值的数组。
      3. 使用相对跳转指令b/bl,不可使用ldr