Элегантный способ установить клев SFR

Я хотел бы переместить клочок с Аккумулятора на верхний клочок P1.

Пока я устанавливаю клев постепенно

MOV C, ACC.3
MOV P1.7, C
MOV C, ACC.2
MOV P1.6, C
MOV C, ACC.1
MOV P1.5, C
MOV C, ACC.0
MOV P1.4, C

что кажется мне плохим способом: это стоит 12 циклов команд, а код длинный. Я надеялся, что SWAP а также XCHD мог бы добиться цели, но косвенная адресация, похоже, не работает в области памяти SFR.

Есть ли какой-нибудь более быстрый или короткий (не обязательно оба) способ его кодирования? Я хотел бы оставить нетронутым нижний кусочек P1.

2 ответа

Решение

Если вы используете младшие 4 бита P1 в качестве входа, вы хотите, чтобы они были установлены на 1 и это легко сочетается с вашим кодом.

swap A
orl A, #15
mov P1, A

Если вы используете их в качестве вывода, вы можете использовать чтение-изменение-запись, например:

anl A, #15
swap A
anl P1, #15
orl P1, A

Обратите внимание, это на мгновение обнулит контакты 3-7. Если это не приемлемо, вам придется рассчитать новое значение в регистре.

Я не знаком с этим процессором, но вы могли бы сделать это с 1 AND1 SHL и 1 OR работает на байтах.

На Intel 8086+, где al обозначает 8 битACC а также bl стоит за 8 бит-P1было бы так:

and bl, 0x0f    # clear high nybble
ror al, 8       # or shl 8 if accumulator can be discarded
or  bl, al
Другие вопросы по тегам