【问题标题】:Elegant way to set SFR nibble设置 SFR 半字节的优雅方式
【发布时间】:2015-10-27 19:30:35
【问题描述】:

我想将一个半字节从累加器移动到 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 的下半字节保持不变。

【问题讨论】:

  • P1的低4位是作为输入还是输出?
  • @Jester 它们用于输出。

标签: assembly bit-manipulation 8051 nibble


【解决方案1】:

如果您使用 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 归零。如果这不可接受,您将不得不在寄存器中计算新值。

【讨论】:

  • 我正要使用基于 Kenney 答案的解决方案来编辑​​我的答案,但您的答案为我做到了 :-) 暂时为零的引脚对我来说没问题(P1.2 的负边缘是用于发送数据)。
【解决方案2】:

我不熟悉那个 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

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2012-01-26
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多