为什么MOV指令被ADD指令取代

vbe*_*nar 5 assembly arm thumb cortex-m raspberry-pi-pico

我有以下说明:mov r1, r7在我的汇编代码中,但在研究反汇编之后,我发现实际生成的代码是adds r1, r7, #0

我检查了ARMv6-M架构参考手册,发现有一条MOVS <Rd>,<Rm>指令(A6.7.40)与ADDS.

虽然这不是一个大问题,但我仍然很困惑为什么汇编程序会替换我用不同操作码编写的代码。根据我正在阅读的书,所有非跳转指令都需要 1 个周期(我更希望汇编器是愚蠢的,而不是试图为我优化某些东西)。

我正在使用 Raspberry Pi Pico SDK,它使用 GNU 汇编器,据我所知。

我的所有代码都是用 helloworld.S 编写的,完整的源代码是:

.thumb_func
.global main

main:
mov r7, #0
bl stdio_init_all
loop:
ldr r0, =helloworld
add r7, #1
mov r1, r7
bl printf
mov r0, #250
bl sleep_ms
b loop
.data
.align 4
helloworld: .asciz "Hello World %d\n"
Run Code Online (Sandbox Code Playgroud)

Sim*_*ler 5

您正在编写 Thumb 模式汇编代码,并且 RPi Pico 支持 Thumb-2,这意味着实际输出将采用UAL 格式

如果参考ARMv6-M参考手册,表D4-1指定了UAL之前的Thumb语法到UAL语法的转换,值得注意的是:

UAL 之前的 Thumb 语法 等效的 UAL 语法 笔记
MOV <Rd>, <Rm> ADDS <Rd>, <Rm>, #0 如果<Rd><Rm>都是R0-R7。
MOV <Rd>, <Rm> 否则。

正如 Tom 所建议的,.syntax unified如果您想编写 UAL 代码(然后将按原样实际组装),您可以添加。

  • 我怀疑(但尚未验证)旧语法中“mov”汇编为“add”的原因是显式“mov”后来被添加到指令集中,并且添加零曾经是这样的完毕。 (2认同)