разница между ldr и ldr.w - PullRequest
4 голосов
/ 21 марта 2012

Мне недавно пришлось отлаживать двоичный файл MachO, и я наткнулся на следующую инструкцию: -

ldr.w r4, [r1, r0, lsl #2]

Я понимаю, что ldr r4, [r1, r0, lsl #2] сдвигает r0 влево два раза, добавляетэто к r1 и разыменовывает результат.

Чем отличается ldr.w?

Ответы [ 3 ]

6 голосов
/ 21 марта 2012

.W - необязательный спецификатор ширины инструкции.Это не влияет на поведение инструкции как таковой, оно просто гарантирует, что генерируется 32-битная инструкция.Подробнее см. infocenter.arm.com :

LDR (относительно ПК) в Thumb-2 Вы можете использовать спецификатор ширины .W, чтобы принудительноLDR для генерации 32-битной инструкции в коде Thumb-2.LDR.W всегда генерирует 32-битную инструкцию, даже если цель может быть достигнута с помощью 16-битной LDR.Для прямых ссылок LDR без .W всегда генерирует 16-битную инструкцию в коде Thumb, даже если это приводит к сбою для цели, которая может быть достигнута с помощью 32-битной инструкции Thumb-2 LDR.

1 голос
/ 22 марта 2012

Есть инструкции ARM и большого пальца.Некоторые процессоры имеют расширения thumb2 для инструкций thumb, которые хороши, плохи или иным образом напоминают инструкции ARM.Иногда вы можете хотеть одно, а получаете другое.Конечно, в пределах большого пальца вы можете использовать .w, чтобы подразумевать более широкую 32-битную инструкцию thumb2 вместо 16-битной инструкции большого пальца.Иногда синтаксис делает очевидным, какой вы хотите, поскольку инструкции thumb2 довольно ограничены по сравнению с ARM и thumb2.

Также обратите внимание, что существуют разные разновидности thumb2, существенно отличающиеся между ARMv6 и ARMv7.Я думаю, что я насчитал 30-40 инструкций ARMv6 thumb2 и более 100 инструкций ARMv7 thumb2.(вы увидите это, если вы использовали cortex-m3 и привыкли к нему, а теперь попробуйте использовать cortex-m0).

1 голос
/ 21 марта 2012

Из ARM Assembler Manual :

Вы можете использовать спецификатор .W width, чтобы LDR генерировал 32-битную инструкцию в коде Thumb-2.LDR.W всегда генерирует 32-битную инструкцию, даже если цель может быть достигнута с помощью 16-битной LDR.

...