装配中的重新安置

Éti*_*nne 5 assembly arm bare-metal

我有一个用于汇编的裸机ARM的启动代码,我试图了解它是如何工作的.二进制文件写在一些外部Flash中,并在启动时将其自身的一部分复制到RAM中.即使我读过这个维基百科条目,我仍然没有在这种情况下完全获得重定位的概念.RAM映射到低地址窗口,闪存在高地址窗口中.有人可以向我解释为什么我们在这里测试链接寄存器的值吗?

/* Test if we are running from an address, we are not linked at */
       bl check_position
 check_position:
        mov     r0, lr                  
        ldr     r1, =check_position
        cmp     r0, r1                  /* ; don't relocate during debug */
        beq     relocated_entry 
Run Code Online (Sandbox Code Playgroud)

old*_*mer 5

我的猜测是应用程序从RAM中运行,调试应用程序时,这个作者也许是使用某种引导程序和或JTAG的直接加载测试程序到RAM中,因此没有理由复制和运行(这可能导致崩溃).

你会做这样的事情的另一个原因是避免无限循环.例如,如果您想从闪存(通常必须)启动但是从ram执行,最简单的方法是将整个闪存或整个闪存的一部分复制到ram并且只分支到ram的开头.当你这样做意味着你再次点击"将应用程序复制到ram and branch"循环,以避免它第二次(这可能会让你崩溃),你有一些我从flash运行这个循环或不测试.