【问题标题】:I got "error #29 : expected an expression "while using inline assembly instructions in stm32f3. How can it be resolved?在 stm32f3 中使用内联汇编指令时出现“错误 #29:期望表达式”。如何解决?
【发布时间】:2017-03-21 18:53:25
【问题描述】:

我正在尝试学习 arm cortex m4 的汇编编码。

__asm volatile (
                "   LDR r0,=MY_NUM          \n" /* Restore the context. */
                "                                       \n"
                ".align 2                   \n"
                "MY_NUM: .word 0x12345678       \n" 
                );

screenshot

我在 ldr 指令中收到“错误 #29:预期的表达式”。 如何解决?

【问题讨论】:

  • 建议:不要使用内联汇编。这是一个复杂的事情,最好在你学会独立汇编之后留下来;)
  • 感谢回复,
  • 感谢回复,但我想使用 cortex m4 的汇编编码,我该如何处理?我在 FreeRTOS 端口中看到了内联汇编,我试图在我的代码中实现它。
  • @TejalBhardwaj - 如果您希望使用 Cortex-M4 的程序集...那么您只需编写独立的 ARMv7 程序集。您特定的基于 Cortex-M4 的硬件的供应商可能已经提供了您需要的所有示例文件;特别是关于启动代码;这是“启动”所必需的 - 假设您有一个裸机环境。
  • 如果您在 C 中需要它,那么内联是唯一的方法。但是,如果可以的话,您可以在单独的文件中编写整个 asm 函数并从 C 中调用它们。

标签: assembly arm cortex-m3 stm32f4discovery


【解决方案1】:

您使用的 ARMCC 没有真正的内联汇编程序,而是具有类似于汇编的编译语言。 .align.word 等指令对它没有任何意义。

代码几乎是 GCC + GNU AS 的正确语法,但与大多数汇编程序一样,GNU AS 要求任何不是标签的东西都必须缩进一个空格或制表符。 .align 指令前需要一个空格。虽然这将编译它会具有未定义的行为,因为它修改了 2 个寄存器和条件代码而不通知编译器(假设寄存器未更改),并且如果为拇指模式构建,则从未指定的地址读取一个字节。

0x12345678 反汇编为:

0:   12345678        eorsne  r5, r4, #120, 12        ; 0x7800000

或者在拇指模式下:

0:   5678            ldrsb   r0, [r7, r1]
2:   1234            asrs    r4, r6, #8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2011-06-11
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多