Я пишу код ассемблера для Beaglebone Black PRU (на языке ассемблера PASM
), и я изо всех сил пытался решить, казалось бы, простую проблему.
Как следует из заголовка, мне нужно скопировать один бит из указанной позиции в другой регистр в той же позиции.
Например,
Скажи, что у меня
r1 = 0bABCDExGH
r2 = 0bIJKLMyOP
где заглавные буквы представляют существующие данные, которые не должны быть изменены. Я хочу скопировать x в y.
Теперь я знаю миллион способов сделать это при нормальных обстоятельствах, но выгода в том, что у меня есть только одна операция, чтобы сделать это. Я могу заранее настроить некоторые разные вещи, но само это перемещение должно происходить за одну операцию.
PASM позволяет ссылаться на отдельные биты с помощью точечных суффиксов, например, r2.t3
конкретно ссылается на бит 3. Благодаря этому я решил, что могу использовать что-то вроде
MOV r2.t3, r1.t3
Но компилятор жалуется, что use of .T field not allowed here
.
Моей следующей попыткой было скопировать r2, например, в r3, очистить соответствующий бит, а затем ИЛИ с тем же битом .t. Так
MOV r3, r2
CLR r3, 3
OR r2, r3, r1.t3
Но, опять же, use of .T field not allowed here
.
Это то, где я сдался. Документация по PASM ограничена и запутана, и я не могу найти веских причин, по которым суффикс .T
здесь не разрешен (.b
для доступа на уровне байтов, кажется, работает просто отлично).
Некоторые справочные материалы, которые я использовал: