在移植 RT-Thread 时,使用Make 进行编译,结果遇到了下面问题:
rtt_os/cortex-m33/context_gcc.S: Assembler messages:
rtt_os/cortex-m33/context_gcc.S:154: Error: thumb conditional instruction should be in IT block – vstmdbeq r1!,{d8-d15}' rtt_os/cortex-m33/context_gcc.S:198: Error: thumb conditional instruction should be in IT block --
vldmiaeq r1!,{d8-d15}’
make: *** [rtt_os/cortex-m33/subdir.mk:13: rtt_os/cortex-m33/context_gcc.o] Error 1
在使用 arm-none-eabi-gcc
编译 ARM 架构代码时,你可能会碰到一些控制汇编器行为的编译器选项。-wa
是一个 GCC 编译器选项,用于向汇编器传递参数。
-wa,-mimplicit-it=thumb
实际上是一组两个选项,它们的作用如下:
-wa
选项-wa
选项允许你将参数直接传递给汇编器。它用于告诉 gcc
后端,在调用 as
汇编器时附加额外的命令行参数。你可以使用这个选项添加任何标准的汇编器命令行参数。
语法如下:
gcc -c -o output.o source.c -Wa,<assembler-options>
其中 <assembler-options>
是要传递给 as
汇编器的选项列表,用逗号分隔。
-mimplicit-it=thumb
选项-mimplicit-it=thumb
是传递给 as
汇编器的一个选项,它和 Thumb 指令集有关。
-m
: 这总是 as
汇编器选项的前缀,表示这是一个指定给汇编器的机器相关的选项。
implicit-it
: IT 指令是 ARM 架构中的「If-Then
」指令,它用于 Thumb-2 指令集中的条件执行。在 ARM 模式下,大多数指令都可以直接带有条件码进行条件执行,而在 Thumb 模式(特别是在更旧的架构中),你需要显式地使用 IT 指令来实现条件执行。
=thumb
: 这个值告诉汇编器在必要时隐式地插入 IT 指令,以使得后面的 Thumb 指令能够条件执行。这是对于兼容性的考虑,特别是在混合 ARM 和 Thumb-2 代码时有用。在 ARMv8 中,大多数形式的条件执行都已经被弃用,除了分支指令。
当使用 -mimplicit-it=thumb
时,你不需要在汇编代码中显式编写 IT 指令,汇编器会在需要的时候自动插入。
-wa,-mimplicit-it=thumb
在命令行中组合这两个选项的实例如下:
arm-none-eabi-gcc -c -o output.o source.c -Wa,-mimplicit-it=thumb
这条命令会编译 source.c
文件,并将 -mimplicit-it=thumb
选项传递给汇编器,允许在生成 Thumb-2 指令时自动插入 IT 指令。