设置 SFR 半字节的优雅方式

Elegant way to set SFR nibble

我想将一个半字节从累加器移动到 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 个指令周期并且代码很长。我希望 SWAPXCHD 可以解决问题,但间接寻址在 SFR 内存区域似乎不起作用。

有没有更快或更短(不一定都是)的编码方式?我想保留 P1 的低半字节不变。

我不熟悉 CPU 但你可以用 1 AND、1 SHL 和 1 OR 对字节进行操作。

在Intel 8086+上,al代表8位-ACCbl代表8位-P1,它会是这样的:

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

如果您使用 P1 的低 4 位作为输入,您希望将它们设置为 1,这很容易合并到您的代码中。

swap A
orl A, #15
mov P1, A

如果你将它们作为输出,你可以使用read-modify-write,例如:

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

注意,这会暂时将引脚 3-7 置零。如果这不可接受,您将不得不在寄存器中计算新值。