在 stm32f3 中使用内联汇编指令时,我得到了“错误#29:需要一个表达式”。怎么解决?

问题描述 投票:0回答:1

我正在尝试学习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:需要一个表达式”。 怎么解决?

assembly arm inline-assembly cortex-m armcc
1个回答
2
投票

您使用的 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
© www.soinside.com 2019 - 2024. All rights reserved.