Assembly 忽略重要数据的分支指令?

Assembly 忽略重要数据的分支指令?,assembly,arm,startupscript,Assembly,Arm,Startupscript,我在理解分支指令B arm926ejs_reset_handler时遇到一个问题,该指令跳转到标签arm926ejs_reset_handler:,因此忽略了中间的代码。我想知道为什么会有人这样做 还有一些额外的解释。标签\u开始:是程序的入口点。分支指令忽略的行是启动ISROM应该在启动时获得的参数但是如果我们跳过这些参数,引导ISROM如何获得这些参数呢?这对我来说毫无逻辑。 __start: arm926ejs_reset: B arm926ejs_reset_handler

我在理解分支指令
B arm926ejs_reset_handler
时遇到一个问题,该指令跳转到标签
arm926ejs_reset_handler:
,因此忽略了中间的代码。我想知道为什么会有人这样做

还有一些额外的解释。标签
\u开始:
是程序的入口点。分支指令忽略的行是启动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:

它只是在一些数据上进行分支-代码可以通过使用
\u start
arm926ejs\u reset
作为基址的索引寻址来获取这些数据

它只是在一些数据上进行分支-代码可以通过使用
\u start
arm926ejs\u reset
作为基址的索引寻址来获取这些数据

数据和代码之间有区别-代码包含执行的指令,而数据由代码使用。根本的区别在于数据(通常)无法执行

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


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

数据和代码之间存在差异-代码包含执行的指令,而数据则由代码使用。根本的区别在于数据(通常)无法执行

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


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

这就是分支的作用,它会在某个地方进行分支或跳转。就像C语言中的goto一样。如果它不是那样工作的话,它会非常糟糕,你也无法编写程序。程序计数器所在的位置与它可以访问的内容完全无关。其他指令集使用单词jump而不是branch,两者在本上下文中的含义相同,根据定义,代码执行分支或跳转到另一条路径,留下它原来所在的路径。还请阅读arm手册,了解前几个/多个(取决于体系结构)内存(单词)位置是重置向量,因此,为了避免出现问题,您必须使用分支到某处或ldr pc,分支到某处,以便正确使用异常表。这正是此代码所做的。启动作为入口点仅与加载程序(如加载linux二进制应用程序的操作系统)相关,这似乎是带有异常表的启动代码,一旦将此二进制文件放入ram/rom以启动处理器,则启动标签就不相关。这就是分支所做的,它在某处分支或跳跃。就像C语言中的goto一样。如果它不是那样工作的话,它会非常糟糕,你也无法编写程序。程序计数器所在的位置与它可以访问的内容完全无关。其他指令集使用单词jump而不是branch,两者在本上下文中的含义相同,根据定义,代码执行分支或跳转到另一条路径,留下它原来所在的路径。还请阅读arm手册,了解前几个/多个(取决于体系结构)内存(单词)位置是重置向量,因此,为了避免出现问题,您必须使用分支到某处或ldr pc,分支到某处,以便正确使用异常表。这正是此代码所做的。启动作为入口点仅与加载程序(如加载linux二进制应用程序的操作系统)相关,这似乎是带有异常表的启动代码,一旦将此二进制文件放入ram/rom以启动处理器,则启动标签就与此无关。