Я только начинаю с архитектуры 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
Ahh, то, что вам не хватает, является то, что STM32 - это кортика-m, которая является машиной большого пальца (поддерживает расширения большого пальца2 в зависимости от архитектуры), вы пытались использовать 32-битную инструкцию ARM для декодирования BL. –
ОК, спасибо! Мне было интересно, почему, похоже, было сочетание 16 и 32-битных инструкций. Просто подумал, что я еще не встречал документацию. Я не помню нигде до сих пор, что STM32 - только для большого пальца ... – Eric61392
Он где-то скажет, что это кортика-m, и либо armv6m, либо armv7m (последний m, также указывающий cortex-m), затем из архитектурные справочные руководства для тех, кто поясняет, что это только ядра с большим пальцем (добавлены расширения большого пальца2, инструкции в основном переменной длины, какое-то одно полуслова - два). Инструкция bl была там с первого дня работы ARMV7T (указательный палец) большого пальца, но все в этих ядрах было 16-битными инструкциями, а затем они отображали один в один, чтобы манипулировать инструкциями (ясно, что декодер просто переводил команду руки и кормление которого в). –