Как определить, является ли слово (4 байта) 16-битной или 32-битной инструкцией?
Как мне узнать, представляют ли байты в слове 16-битную инструкцию или 32-битную инструкцию?
Я упомянул ARM ARMv7M, и мне не ясно, как различить, является ли это 16-битной инструкцией или 32-битной инструкцией.
Это говоритIf bits [15:11] of the halfword being decoded take any of the following values, the halfword is the first halfword of a 32-bit instruction:
• 0b11101
• 0b11110
• 0b11111.
Otherwise, the halfword is a 16-bit instruction
Означает ли это, что процессор всегда выбирает полуслово, проверяет их и решает, является ли он 16- или 32-разрядным?
Что означает первое полуслово? Бит [31-16] или Бит [15-0] в слове?
Если у меня есть 32-разрядная версия, то могу ли я узнать, является ли это 32-разрядной или 16-разрядной инструкцией?
Благодарю.
1 ответ
В Thumb "32-битные" инструкции по-прежнему состоят из двух отдельных полуслов, поэтому "первое полуслово" является первым полусловом кодировки, которое ничего не говорит о расположении в памяти. Инструкции большого пальца выровнены наполовину, поэтому любое данное слово памяти может содержать две 16-битные инструкции, 16-битную инструкцию и одну половину 32-битной инструкции, две половины двух разных 32-битных инструкций или одну целую 32 инструкция
Концептуально процессор декодирует одно половинное слово за раз, поэтому, если он видит один из вышеупомянутых битовых шаблонов, он знает, что ему также необходимо декодировать следующее половинное слово, прежде чем он сможет фактически выполнить эту инструкцию. Реальность несколько усложняет это, поскольку Cortex-M3/M4 фактически всегда извлекает из памяти только 32-битные слова, поэтому корреляция между количеством "выборок команд" и количеством фактически декодированных и выполненных команд зависит от самого кода. Просто представьте, что эти выборки должны заполнить 4-байтовый буфер, из которого конвейер отбрасывает отдельные полуслова (насколько я знаю, это может быть не так уж далеко от истины).
Итак, если у вас есть половинное слово, содержащее одно из этих значений в его старших битах, то вы знаете, что это первая половина 32-битной кодировки, и вам нужно интерпретировать его вместе со следующим полусловом. И наоборот, если у вас есть половинное слово с любым другим значением в его старших битах, то это либо 16-битная кодировка, либо вторая половина 32-битной кодировки, в зависимости от того, что было предыдущим полусловом.
Обратите внимание, что инструкции всегда имеют порядок байтов, поэтому фактическая схема 32-битной кодировки в памяти выглядит следующим образом, где адрес A является четным числом:
--------------------------------
address A | bits 7:0 of first halfword |
--------------------------------
A+1 | bits 15:8 of first halfword |
--------------------------------
A+2 | bits 7:0 of second halfword |
--------------------------------
A+3 | bits 15:8 of second halfword |
--------------------------------