对于二进制数值而言,最简单的运算形式是逻辑与(logical AND)、逻辑或(logical OR)和异或(exclusive OR)。这些运算通过真值表(truth table)来表述。
-
逻辑与真值表(Logical AND,AND)
image.png -
逻辑或真值表(Logical ORA,ORA)
image.png -
异或真值表(Exclusive OR,EOR)
image.png
上述真值表的规律可以概括为:
- 当且仅当逻辑与AND的两个操作数都为真(用数字1表示)时,得到的结果才为真(用数字1表示),否则为假(用数字0表示)。
- 当且仅当逻辑或ORA的两个操作数都为假(用数字0表示)时,得到的结果才为假(用数字0表示),否则为真(用数字1表示)。
- 当且仅当异或EOR的一个输入为真,另一个为假时,互斥OR的结果为真(1),否则为假(0)。
下面的表格中展示了对两个1比特(1bit)数值进行逻辑操作的结果。但是由于6502由8位寄存器和内存组成,每个指令将同时对两个8位值进行操作。
image.png
理解这些操作的性质和实际应用是很重要的,因为它们在其他算法中广泛使用:
- 逻辑与操作通常起到一个过滤器的作用,并经常用于选择位的子集从一个值(例如,状态标志从外围控制芯片)。
- 逻辑或允许将位插入到现有的值中(例如,在外围控制芯片中设置控制标志)。
- 异或EOR指令允许设置或者反转所选位的数据。
在6502芯片中,上述操作都是通过AND、ORA、EOR指令实现的。两个操作数中,一个是累加器的当前内容,另一个在内存中作为即时值或在指定的位置。操作的结果被放置在累加器中,并相应地设置0和负标志。
; Example logical operations
AND #$0F ;Filter out all but the least 4 bits
ORA BITS,X ;Insert some bits from a table
EOR (DATA),Y ;EOR against some data
EOR指令的一个非常常见的用法是计算一个值的补码(或逻辑NOT)。这涉及到反转值中的每一位,最简单的计算方法是对每个位都是1的值进行单独的异或运算。
; Calculate the complement
EOR #$FF
宏库包含了16位和32位and、ORA、EOR和NOT操作的参考代码,尽管它们在解释器之外几乎没有用处。
网友评论