我正在尝试学习arm cortex m4的汇编编码。
__asm volatile (
" LDR r0,=MY_NUM \n" /* Restore the context. */
" \n"
".align 2 \n"
"MY_NUM: .word 0x12345678 \n"
);
我在 ldr 指令中收到“错误 #29:需要一个表达式”。 怎么解决?
您使用的 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