2015-10-27 5 views
0

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

На данный момент, я поставил ПОЛУБАЙТОМ по кусочкам

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 нетронутым.

+0

Являются ли низкие 4 бита P1 используемыми в качестве входа или выхода? – Jester

+0

@Jester используются для вывода. –

ответ

1

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

swap A 
orl A, #15 
mov P1, A 

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

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

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

+0

Я как раз собирался отредактировать свой ответ с решением, основанным на ответе Кенни, но ваш ответ сделал это для меня :-) На мгновение нулевые булавки подходят для меня (отрицательный фронт на P1.2 используется для отправки данных). –

1

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

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

and bl, 0x0f # clear high nybble 
ror al, 8  # or shl 8 if accumulator can be discarded 
or bl, al