-2

我有用于 AT91sam9 ARM 控制器的 AT91Bootloader。我需要添加一些额外的硬件初始化,但我只编译了 .bin 文件。我将 bin 文件加载到内存并尝试调用它:

((void (*)())0x00005000)();

但是,没有任何结果。请尽量少用汇编。我之前被介绍过汇编程序,但由于它的同谋,我无法理解 ARM 汇编程序。如何从引导加载程序中间调用,执行 bin 文件(它将在某个内存扇区,例如 0x00005000)然后返回引导加载程序并继续执行它自己的代码?

4

2 回答 2

2

如果 ARM asm “太复杂”,您会发现很难调试您遇到的任何问题。Basic* ARM 汇编是我遇到的最简单的汇编语言之一。

只要“.bin”格式正确,您的代码应该可以工作(尽管我不会在那里使用硬编码地址)。常见问题:

  • 入口点应该是ARM代码;一些编译器默认使用 Thumb。使 Thumb 代码工作是可能的(如果有点棘手)。
  • 入口点必须位于文件的开头。如果不拆卸,很难判断您是否正确完成了此操作。
  • 链接器将在必要时插入“thunk”(又名“存根”)。一些链接器中的一个怪癖意味着 thunk 可以放在入口点之前。您可以使用(此处--stub-group-size=-1的文档)解决此问题。

* 忽略不需要开始的 Thumb/VFP/NEON 等内容。

于 2013-03-03T22:46:01.780 回答
1

ARM 程序集是最简单的程序之一,非常简单。如果你想继续做裸机,你至少需要学习一些组装。例如理解 Alexey 的评论。

您要查找的指令是 BX,它分支到一个地址,您需要分支到引导加载程序下载的代码的程序集是:

.globl tramp
tramp:
   bx r0

C原型是

void tramp ( unsigned int address );

正如评论中提到的,程序需要针对您运行它的地址进行编译和/或它需要与位置无关,否则它将无法工作。此外,您还需要使用正确的入口点构建应用程序,如果它是原始二进制文件并且您分支到加载二进制文件的地址,则二进制文件需要能够以这种方式启动,方法是将二进制文件中的第一个字设为执行的入口点。

还要明白一个elf格式的文件包含了你要加载的数据,但整体上不是你要加载的数据。它是一个“二进制文件”,是的,但是要运行其中包含的程序,您需要解析和提取可加载部分并将它们加载到正确的位置。

如果您不知道这些术语的含义,请使用 google 和/或搜索 SO,答案就在那里。

于 2013-03-01T14:43:21.203 回答