2017-02-07 10 views
2

Я только начинаю с архитектуры ARM на моем Nucleo STM32F303RE, и я пытаюсь понять, как кодируются инструкции.декодировать инструкцию ARM BL

Я работаю простую программу LED-мигает, и первые несколько инструкций разобранных применений являются:

08000188: push {lr} 
0800018a: sub  sp, #12 
235   __initialize_hardware_early(); 
0800018c: bl  0x80005b8 <__initialize_hardware_early> 

Этих инструкции постановляют следующее в шестнадцатеричном файле (отображается странно в Затмении - каждый 32- разрядное слово в MSB порядке, но Eclipse, кажется, не знает ... но это для другой темы):

address 0x08000188: B083B500 FA14F000 

Использование архитектуры ARM Ref руководства, я подтвердил первые 2 инструкции, нажми (0xB500) и sub (0xB083). Но я не могу сделать никакого смысла из инструкции «bl».

Инструкция hex состоит из 0xFA14F000. Руководство по реф говорит, что ломается, как это:

31.28 27 26 25 24 23............0 
cond  1 0 1 L signed_immed_24 

первый "F" (0xF ......) имеет смысл: все условия устанавливаются (Always).

«A» не имеет смысла, поскольку бит L должен быть установлен (1011). Разве это не должно быть 0xFB ......?

И signed_immed_24 тоже не имеет смысла. Руководство иого говорит:

- start with 0x14F000 
- sign extend to 30 bits (signed 2's-complement), giving 0x0014F000 
- shift left to form 32-bit value, giving 0x0053C000 
- add to the PC, which is the current instruction + 8, giving 0x0800018c + 8 + 0x0053C000, or 0x0853C194. 

Так я получаю филиальный адрес 0x0853C194, но разборка показывает 0x080005B8.

Что мне не хватает?

Спасибо! -Eric

ответ

1

бл-два, отдельный, 16 бит инструкция. Armv5 (и более старый) ARM ARM лучше документирует их.

111HHoffset11 

С ARM ARM

Первая команда имеет большой палец H == 10 и подает высокую часть ветвь смещения. Эта инструкция устанавливает для вызова подпрограммы и распространяется между формами BL и BLX.

Вторая команда Thumb имеет H == 11 (для BL) или H == 01 (для BLX). Он обеспечивает низкую часть смещения ответвления и вызывает вызов подпрограммы .

0xFA14 0xF000

0xF000 это первая инструкция верхнего смещения нулей 0xFA14 является вторая инструкция смещение 0x214

Если начиная с 0x0800018c то 0x0800018C + 4 + (0x0000214 < < 1) = 0x080005B8. 4 - это две инструкции для текущего ПК. И смещение - это единицы (16 бит) инструкций.

Я полагаю, что armv7-m ARM ARM также охватывает его, но его труднее читать, и, видимо, функции были добавлены. Но они не влияют на вас с помощью этой ветки.

ARM ARM ARM лучше справляется с описанием того, что происходит. Вы можете certaily взять эти две отдельные инструкции и их раздвинуть

.byte 0x00,0xF0 
nop 
nop 
nop 
nop 
nop 
.byte 0x14,0xFA 

и будет разветвляться в то же смещение (относительно второй инструкции). Возможно, это сломалось, что в некоторых ядрах, но я знаю в некоторых (после armv5), это работает.

+0

Ahh, то, что вам не хватает, является то, что STM32 - это кортика-m, которая является машиной большого пальца (поддерживает расширения большого пальца2 в зависимости от архитектуры), вы пытались использовать 32-битную инструкцию ARM для декодирования BL. –

+0

ОК, спасибо! Мне было интересно, почему, похоже, было сочетание 16 и 32-битных инструкций. Просто подумал, что я еще не встречал документацию. Я не помню нигде до сих пор, что STM32 - только для большого пальца ... – Eric61392

+0

Он где-то скажет, что это кортика-m, и либо armv6m, либо armv7m (последний m, также указывающий cortex-m), затем из архитектурные справочные руководства для тех, кто поясняет, что это только ядра с большим пальцем (добавлены расширения большого пальца2, инструкции в основном переменной длины, какое-то одно полуслова - два). Инструкция bl была там с первого дня работы ARMV7T (указательный палец) большого пальца, но все в этих ядрах было 16-битными инструкциями, а затем они отображали один в один, чтобы манипулировать инструкциями (ясно, что декодер просто переводил команду руки и кормление которого в). –

Смежные вопросы