2012-03-02 48 views
1

我有一个问题,支持分支指令B arm926ejs_reset_handler跳转到标签arm926ejs_reset_handler:,因此忽略之间的代码。我不知道为什么有人会这样做?忽略重要数据的分支指令?

和一些额外的解释。标签__start:是该程序的入口点。分支指令忽略的行是启动ISROM应该在启动时获得的参数。 但是,如果我们跳过它们,启动ISROM如何获得这些参数?它对我没有任何逻辑。

__start: 
arm926ejs_reset: 
B  arm926ejs_reset_handler 

    .word 0x41676d69 
    .word 0,0,0,0,0 
image_type: 
    .word 0x0000000A 
sizeOfPermanentCode:  
    .word (__image_size) 
    .word 0,0 
bootparameter: 
    .word 0 
    .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 

arm926ejs_reset_handler: 
+0

这就是分支所做的事情,它在某处分支或跳转。就像C中的goto一样。如果它没有这样工作,那将会非常糟糕,你不能编写程序。程序柜台与它可以访问的内容完全无关。其他指令集使用跳转而不是分支,在这种情况下两者意味着同样的事情,根据定义,代码执行分支或跳转到另一个路径,从而留下它所在的路径。 – 2012-03-02 14:38:14

+0

也阅读你的手臂手册,以了解前几个/许多取决于体系结构,内存(字)位置是重置向量,所以为了避免问题,您必须使用分支到某处或ldr pc,某些东西要分支到某处为了正确使用异常表。这正是这个代码正在做的。 – 2012-03-02 14:40:14

+0

作为一个入口点只与加载程序相关(例如加载linux二进制应用程序的操作系统),这似乎是具有异常表的启动代码,并且一旦将此二进制文件置于ram/rom启动时启动标签无关处理器。 – 2012-03-02 14:42:12

回答

3

有数据和代码之间的差 - 代码中包含有执行指令,而数据是由代码中使用。根本的区别是数据(通常)不能执行。

因此,当开始的房间用作数据的存储空间时,代码需要跳过数据,否则数据会被解释为代码,这很可能会导致非法指令和崩溃。

当然,如果代码位于当前程序计数器之前(跳转后),则代码可以访问该数据 - 从代码的角度来看,如果数据位于代码之前或之后,则不会产生影响。

2

这只是分支在一些数据 - 该代码可以在此获得的数据通过索引使用__startarm926ejs_reset为基址寻址。