2015-10-27 74 views
0

我想將一個半字節從累加器移到P1的高半字節。優雅的方式設置SFR輕咬

現在,我一點

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個指令週期和代碼很長。我希望SWAPXCHD可以做到這一點,但間接尋址似乎不適用於SFR內存區域。

有沒有更快或更短(不一定是兩種)的方式來編碼?我想留下P1的低位半字未觸動過。

+0

P1的低4位用作輸入還是輸出? – Jester

+0

@Jester它們用於輸出。 –

回答

1

如果您輸入使用P1的低4位你希望它們被設置爲1,這很容易組合到你的代碼中。

swap A 
orl A, #15 
mov P1, A 

如果您使用的是他們作爲輸出,你可以使用讀 - 修改 - 寫,如:

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

注意,這將暫時零個銷3-7。如果這是不可接受的,你將不得不計算寄存器中的新值。

+0

我剛剛用基於Kenney答案的解決方案來編輯​​我的答案,但您的答案對我來說是這樣做的:-)暫時零針腳對我來說沒問題(P1.2的負邊緣用於發送數據)。 –

1

我不熟悉那個CPU,但是你可以用,1 SHL和1 OR來操作字節。

在Intel 8086+,其中al代表8比特ACCbl代表8bit- P1,它會是這樣的:

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