我有用于 AT91sam9 ARM 控制器的 AT91Bootloader。我需要添加一些额外的硬件初始化,但我只编译了 .bin 文件。我将 bin 文件加载到内存并尝试调用它:
((void (*)())0x00005000)();
但是,没有任何结果。请尽量少用汇编。我之前被介绍过汇编程序,但由于它的同谋,我无法理解 ARM 汇编程序。如何从引导加载程序中间调用,执行 bin 文件(它将在某个内存扇区,例如 0x00005000)然后返回引导加载程序并继续执行它自己的代码?
我有用于 AT91sam9 ARM 控制器的 AT91Bootloader。我需要添加一些额外的硬件初始化,但我只编译了 .bin 文件。我将 bin 文件加载到内存并尝试调用它:
((void (*)())0x00005000)();
但是,没有任何结果。请尽量少用汇编。我之前被介绍过汇编程序,但由于它的同谋,我无法理解 ARM 汇编程序。如何从引导加载程序中间调用,执行 bin 文件(它将在某个内存扇区,例如 0x00005000)然后返回引导加载程序并继续执行它自己的代码?
如果 ARM asm “太复杂”,您会发现很难调试您遇到的任何问题。Basic* ARM 汇编是我遇到的最简单的汇编语言之一。
只要“.bin”格式正确,您的代码应该可以工作(尽管我不会在那里使用硬编码地址)。常见问题:
--stub-group-size=-1
的文档)解决此问题。* 忽略不需要开始的 Thumb/VFP/NEON 等内容。
ARM 程序集是最简单的程序之一,非常简单。如果你想继续做裸机,你至少需要学习一些组装。例如理解 Alexey 的评论。
您要查找的指令是 BX,它分支到一个地址,您需要分支到引导加载程序下载的代码的程序集是:
.globl tramp
tramp:
bx r0
C原型是
void tramp ( unsigned int address );
正如评论中提到的,程序需要针对您运行它的地址进行编译和/或它需要与位置无关,否则它将无法工作。此外,您还需要使用正确的入口点构建应用程序,如果它是原始二进制文件并且您分支到加载二进制文件的地址,则二进制文件需要能够以这种方式启动,方法是将二进制文件中的第一个字设为执行的入口点。
还要明白一个elf格式的文件包含了你要加载的数据,但整体上不是你要加载的数据。它是一个“二进制文件”,是的,但是要运行其中包含的程序,您需要解析和提取可加载部分并将它们加载到正确的位置。
如果您不知道这些术语的含义,请使用 google 和/或搜索 SO,答案就在那里。