Как лучше всего проверить состояние определенного бита в 32-битной архитектуре слова? - PullRequest
0 голосов
/ 06 ноября 2018

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

До сих пор я мог выполнять свою работу, смещаясь влево и вправо до тех пор, пока интересующий элемент не станет наименее значимым и не расширится знак. Например:

SHL A0, 14, A0 ;Shift the 17th bit 14 times left
SHR A0, 31, A0 ;Shift the bit 31 times right
[A0] B LOOP ;Branch if it's not 0

где A0 содержит флаговый бит 17. Проблема в том, что мне нужно изменить регистр или использовать больше регистров (которые могут уже использоваться). Также необходимо рассчитать количество сдвигов, которые мне нужно сделать, и, хотя это довольно просто, я обычно не в настроении их выполнять. Руководство по обучению обширно, и до сих пор я не смог найти инструкцию, которая бы соответствовала моим потребностям.

Есть ли лучший / более надежный способ выполнить эту задачу?

1 Ответ

0 голосов
/ 07 ноября 2018

Я совершенно новичок в TMS320C6713x и его VelociTI архитектуре, но обычно DSP имеет инструкции для обработки битовых полей.
В этом случае я нашел это:

  • ext извлекает битовое поле, а знак расширяет его в 32-битном регистре.
  • extu то же, что и выше, но ноль расширяет его.
  • clr очистить битовое поле.
  • set установить битовое поле.

Инструкции ext/u работают точно так же, как ваш код (сдвиг влево, затем сдвиг вправо) до такой степени, что непосредственные операнды совпадают.

Возможный код для извлечения бита 17 (обратите внимание, что бит 17 является 18-м битом) может быть:

EXT A0, 14, 31, A0
[A0] B LOOP

Обратите внимание, что этот код не проверен.

CLR и SET могут быть полезны для очистки и установки набора битов соответственно.
Операнд более простой, чем ext/u, это младший бит и старший бит (оба включительно) битового поля.

CLR A0, 0, 3, A0   ;Clear the lowest nibble of A0
SET A0, 4, 7, A0   ;Set the high nibble of the lowest byte of A0

Как предлагается в комментарии, AND также будет делать, но если я правильно понял таблицу данных, вы можете использовать только регистр-регистр или регистр-непосредственное И, где непосредственное значение составляет 5 бит .
Так что для извлечения битов выше бита 4 вам нужно предварительно загрузить регистр.

...