我有一个应用程序编译使用GCC为一个STM32F407 ARM处理器。链接器将其存储在Flash中,但在RAM中执行。一个小型引导程序将应用程序从Flash复制到RAM,然后分支到应用程序的ResetHandler。
memcpy(appRamStart, appFlashStart, appRamSize);
// run the application
__asm volatile (
"ldr r1, =_app_ram_start\n\t" // load a pointer to the application's vectors
&
我得问一下..。它已经让我发疯好几天了。在选择作为工具链后,我的生活变成了一场噩梦,原因很简单--手臂--没有--把每一个评论当作指令,而且有时候它就是不理解一个手臂汇编程序抛出花哨的错误,比如"AREA是一个糟糕的指令“.
下面是我从keil文档中复制并粘贴的代码:
AREA Loadcon, CODE, READONLY
ENTRY ; Mark first instruction to execute
start
BL func1 ; Branch
这是我的A9汇编代码,
ldr x1, = 0x400020 // Const value may be address also
ldr w0, = 0x200018 // Const value may be address also
str w0, [x1]
下面的是预期产出?
*((u32 *)0x400020) = 0x200018;
当我通过编译器对它进行交叉检查时,它给出了不同的结果,如ldr中的mov和mov。如何在c中创建ldr?
我有一个非常奇怪的错误,ldr指令首先将一个有效值加载到R3寄存器中,然后当我使用调试器跨过一条指令时,它突然包含了0x0值。
此程序集由GCC9 for C++17从GCC9生成。
这些指示是:
ldr r3, [r7, #12] ; after this instruction r3 will have value 0x20009da0
ldr r3, [r3, #8] ; after this instruction r3 will have value 0x20003e28
ldr r3, [r3] ; after this instruction r3