Элегантный способ установить клев 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 AND
1 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