Нет инструкции beq или bne в инструкции ARMv7-M?

Я работаю над микроконтроллером STM32l475, который запускает процессор Cortex-M4 и наборы инструкций ARM / Thumb. Я вижу (из objdump), что есть инструкции beq.n и bne.n, сгенерированные в двоичном коде программы ARM (я добавил флаг -mthumb при компиляции программы). Однако я не нахожу этих инструкций по ветвлению в последней версии ARMv7-M руководство.

Кто-нибудь может сказать мне причину? И какие инструкции, доступные в руководстве, эквивалентны этим двум инструкциям ветвления?


person Jay    schedule 25.03.2019    source источник


Ответы (1)


beq и bne - условные переходы; другими словами, они являются условными версиями безусловной ветки b. eq и ne - два разных кода состояния; они описаны в разделе A7.3. beq означает ветвь, если равно, а bne означает ветвь, если не равно.

Инструкция ветвления b имеет два разных кодирования в режиме Thumb. Кодировка, которую вы видите, вероятно, кодирует T1, описанную в разделе A7.7.12:

B<c> <label>

15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
 1  1  0  1 [-<cond>--] [--------imm8---------] 

В этой кодировке код условия (например, eq или ne) кодируется непосредственно в инструкции в битах 8-11. Дизассемблирование из objdump отображает код условия вместо <c> выше. Таким образом, используя таблицу кодов условий в разделе A7.3, вы должны закодировать beq как 11010000[imm8].

person Jeff    schedule 25.03.2019