Синтаксис ARM позволяет опустить средний операнд (первый источник), если он совпадает с адресатом. (По крайней мере, в синтаксисе GAS "Unified"; изначально синтаксис ARM Thumb разрешал его только при фактическом кодировании машиныУ него был отдельный пункт назначения или что-то в этом роде. У GAS разные синтаксисы; GCC обычно переводит его в .syntax unified
режим IIRC, так что это контекст для встроенного asm)
ADD r2,r2,#3
точно совпадает с ADD r2,#3
для ассемблеровкоторые принимают оба. Ассемблер Keil не может, IDK.
Keil против GAS / GCC используют разные директивы, но, как мне кажется, в основном для команд используется один и тот же синтаксис.
В некоторых кодировках команд большого пальца есть место только длязакодируйте 2 операнда, чтобы они выглядели как dst += immediate
, а не dst = src + immediate
на уровне машинного кода. На уровне источника asm Keil документирует его как ADDS Rd, Rd, #imm
(на странице, на которую вы ссылаетесь).
Другое 16-битное кодирование adds
имеет только 3-битное непосредственное значение (0..7
),но использует эти биты, чтобы разрешить кодирование отдельного получателя, adds Rd, Rn, #imm
.
(обратите внимание, что add
вместо adds
обычно требует 32-битной инструкции, поэтому не делайте этого, если вам не нужносохранить флаги.)
Я упоминал об этом, потому что ваши предыдущие вопросы были о Cortex-M. ГАЗ, вероятно, все еще принимает add r2, #3
при сборке в режиме ARM. Первый источник просто неявно является местом назначения.