设置 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 个指令周期并且代码很长。我希望 SWAP
和 XCHD
可以解决问题,但间接寻址在 SFR 内存区域似乎不起作用。
有没有更快或更短(不一定都是)的编码方式?我想保留 P1 的低半字节不变。
我不熟悉 CPU 但你可以用 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
如果您使用 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 置零。如果这不可接受,您将不得不在寄存器中计算新值。
我想将一个半字节从累加器移动到 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 的低半字节不变。
我不熟悉 CPU 但你可以用 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
如果您使用 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 置零。如果这不可接受,您将不得不在寄存器中计算新值。