Разница между ARM ADD с 2 или 3 операндами? - PullRequest
0 голосов
/ 08 октября 2019

При изучении документации armkeil http://www.keil.com/support/man/docs/armasm/armasm_dom1361289861747.htm вам всегда нужны 3 переменные, когда вы выполняете функцию ADD, например:

"MOV r2,#4 \n\t"
"ADD r2,r2,#3 \n\t"

это имеет результат 7 в регистре 2. Нокогда я пытаюсь сделать следующее:

"MOV r2,#4 \n\t"
"ADD r2,#3 \n\t"

Результат один и тот же, в чем принципиальная разница между этими двумя? Разрешено ли использовать второй?

1 Ответ

1 голос
/ 08 октября 2019

Синтаксис 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. Первый источник просто неявно является местом назначения.

...