2012-03-21 12 views
3

Я недавно пришлось отлаживать мачо бинарный и я наткнулся на следующей инструкции: -разница между LDR и ldr.w

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

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

Как отличается ldr.w?

ответ

5

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

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

1

От ARM Assembler Manual:

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

1

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

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