为什么没有以更简单的方式编写此代码?


8

在使用汇编语言时,我遇到了一个问题。这是问题:

假设位P2.2用于控制室外光,位P2.5用于控制建筑物内的光。展示如何打开外部灯和关闭内部灯。

给出的解决方案:

SETB C            ; CY = 1
ORL C, P2.2       ; CY = P2.2 ORed w/ CY
MOV P2.2, C       ; turn it on if not on
CLR C             ; CY = 0
ANL C, P2.5       ; CY = P2.5 ANDed w/P2.5
MOV P2.5,C        ; turn it off if not off

我只是觉得它将完成相同的代码编写工作:

SETB P2.2
CLR P2.5

怎么了


2
也许只是教法-展示了如何使用进位位作为累加器。在这种特殊情况下,我看不到任何优势。看起来像8051汇编代码。
Spehro Pefhany

@SpehroPefhany但据我所知,在某些情况下会使用Acc寄存器,因为它是唯一支持某些指令(如DA,RR,RL等)的寄存器。我认为情况并非如此。我错了吗?
伊尔克·德米雷尔

进位有点宽。在某些情况下,例如梯形逻辑评估,您可能希望将其用作累加器。
Spehro Pefhany

Answers:


11

您说对了,您显示的代码似乎很愚蠢。也许无论运行此机器的机器都不能立即执行操作以在I / O端口上设置位,这就是为什么不能使用SETB P2.2之类的原因。

仍然将CY位设置为1,然后对其进行“或”运算就很愚蠢了。将CY位设置为0,然后对其进行“与”运算也是如此。显然,由于代码可以将CY位直接复制到I / O引脚位。最多应该是4条指令,当然不是6条指令。


所以我可以说,如果某位是位可寻址的,那么我就可以在位上使用位指令,对吗?
伊尔克·德米雷尔(

1
@İlk:不一定。可能会有一些限制,例如,位指令仅适用于某些寄存器,某些“近”存储器等。在不知道处理器的情况下,我们无法确定是否可以使用SETB P2.2。但是,SETB C和MOV P2.2 C显然是可能的。
Olin Lathrop'9

1
@OlinLathrop:几乎可以肯定该处理器是8051的一种变体,并且这些处理器的指令集将允许使用相同的位置SETB bitCLR bit指令MOV bit,C。此外,虽然使用离散指令读取I / O端口,更新值并将其写回将产生与使用read-modify-write指令不同的语义,但按位指令都在I上使用相同的read-modify-write语义/ O端口。
supercat's

9

该代码几乎可以肯定是针对使用8051指令集的处理器的。在该处理器上,您提供的代码变体将与原始变体具有相同的效果,但其运行速度更快。设置进位时执行“ ORL C,P2.2”将不会产生可观察到的效果,只是浪费一些周期(如果我没记错的话,两个CPU周期在8051上总计24个时钟周期;在其他一些变量上可能是不同的数目) 。当进位清除时,与执行“ ANL C,P2.5”类似。尽管在某些处理器中,读取某些I / O位置的请求会产生一些可观察到的效果,但我认为任何8051风格的处理器都没有对任何可位寻址的I / O位置产生这种行为, P2的位数更少。

也许代码的目的是演示ORL C,bitANL C,bit指令,但这似乎是一个奇怪的示例来演示它们。


6

给出的汇编代码可能是编译器生成的。它是以下C语句的未优化版本,其中P2_2P2_5是可按位寻址的对象:

P2_2 |= 1;
P2_5 &= 0;

这似乎等同于P2_2 = 1;P2_5 = 0;,但是如果可位寻址寄存器是易失性对象,则并非如此。对易失性对象的读取-修改-写入操作必须按该顺序执行读取和写入。这样可以确保实际上不会发生因读取或写入寄存器而产生的任何副作用。

尽管我不知道具有副作用的8051位可寻址寄存器,但是编译器无法假定不存在或永远不会存在。


1
关于可能由编译器生成的好点。然而,随后又将问题为什么会有人写P2_2 | = 1,而不是仅仅P2_2 = 1
奥林莱思罗普

3

这些之间的真正区别可能是微妙的。

在简化的答案中,逻辑是读取端口,设置或清除位值,然后将其写回到端口。请注意,整个端口可以在此处重写。

另一方面,该解决方案使用MOV位指令,该指令可能以完全不同的方式进行操作。

如果不仔细研究此处使用的特定零件,则很难确定是否存在差异或是否重要。

或者,可能只是讲师决定让您思考...。毕竟这是他的真正工作。


0

唯一的答案是处理器不直接支持1位指令。但是,当使用进位位时,它知道只有一位被操纵。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.