c - gcc arm __asm inline 在参数中传递常量

标签 c gcc arm inline-assembly

我正在编写一个小型 cortex M0+ 引导加载程序。我在下面有一个内联程序集,它通过从 Flash 中的应用程序位置加载堆栈指针和重置处理程序来从引导加载程序启动主应用程序。

#define FLASH_APP_START 0x1000

[...]

    __asm(
            // Update stack pointer from user code vector table
            "LDR     r0, =%0 \n"
            "LDR     r1, [r0] \n"
            "MOV     sp, r1 \n"

            // Load user code reset handler and jump to the user code
            "LDR     r0, [r0, #4] \n"
            "BX      r0 \n"
            :
            : "X"(FLASH_APP_START)
            :
        );

编译此代码时出现以下错误:

Error: bad expression -- `ldr r0,=#4096'

GCC 在不应该存在的常量前添加#。 如果我用下面的代码替换第一行,它就可以完美地工作。

LDR r0, =0x1000

所以问题是我如何使用定义的常量?

在此先感谢您的帮助

最佳答案

首先,没有理由在这里使用内联汇编,简单的解决方案是将此代码编写为普通的汇编语言文件。您可以在头文件中定义 FLASH_APP_START 宏,如有必要,您可以将其包含在程序集和 C 源文件中。

如果您仍然想使用内联汇编,那么下一个最简单的解决方案是让编译器为您完成大部分工作,并将汇编语句减少到它不能做的事情:

    void ** const flash_vector_table = (void **) FLASH_APP_START;
    asm volatile ("mov sp, %[stack]\n\t"
                  "bx %[reset]\n"
                  :
                  :
                  [stack] "r" (flash_vector_table[0]),
                  [reset] "r" (flash_vector_table[1]));

关于c - gcc arm __asm inline 在参数中传递常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34411317/

相关文章:

c - 如何让这个程序可以接受负数

c - 字段类型不完整;结构已声明

c - 我如何知道 Leak Sanitizer 是否在编译时启用?

c - Glibc 和 uClibc 并排在一个系统上

c - 当其中一个函数/宏在代码中时,Keil 创建 'faulty' hex 文件

c - 我如何使用c语言将文件名的路径传递给void *buffer?

performance - 如何解释两个处理器之间巨大的执行速度差异?

c++ - 为什么 gcc 和 NVCC (g++) 看到两种不同的结构大小?

linux-kernel - ARM Linux : PTE not writable but dirty

c++ - 尝试在目标设备上运行交叉编译的可执行文件失败并显示 : No such file or directory