X-Loader start.s中的GNU汇编程序指令

时间:2014-01-22 13:43:08

标签: assembly gnu directive u-boot omap

我正在分析TI X-Loader代码,以便更深入地了解omap皮质启动序列。

我从/ cpu / omap3文件夹中的start.S文件开始。第一行如下:

#include <config.h>
#include <asm/arch/cpu.h>

.globl _start
_start: 
    b   reset
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang

_hang:
    .word do_hang

    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678 /* now 16*4=64 */l

.global _end_vect
_end_vect:

异常向量(复位向量除外)将跳转到地址“_hang”。 但是那里没有操作码,只有标签do_hang的地址(后面在代码中找到,它是一个死循环函数)。 我对.word的理解是它将值(在我们的例子中是do_hang的地址)复制到二进制文件中的特定位置,在我们的例子中是地址“_hang”。 当PC加载_hang时,程序执行跳转到地址_hang,并且它没有找到操作码而是找到一个地址(do_hang)的值。

我的问题:

  • 不应该有命令“b do_hang”而不是“.word do_hang”吗?
  • 当程序计数器指向不包含操作码的位置但是地址不应该导致系统崩溃时?
  • 不应该.word指令只在.data部分有意义吗?

提前感谢您的帮助。

马丁

1 个答案:

答案 0 :(得分:0)

确定!我知道了,

命令是LDR PC _hang! 它不会跳转到_hang但它会将_hang中的值加载到PC中。 _hang中的值是死循环函数do_hang的地址。

还有一个问题: 为什么不在每个向量中简单地使用“b do_hang”? 好吧,我想我们永远不会知道。

此致

马丁