assembly - 如何在没有 XOR 指令的 CPU 上进行 XOR

标签 assembly

这更像是一个有趣的问题。我正在研究 SC61860 CPU,它是 8 位 CPU,用于 1987 年的 Sharp PC-1360 掌上电脑(也用于 PC-1401 和 1403)。它的指令集实际上并不包含 XOR。它确实有AND、OR、比较、减法和加法指令。

我尝试了 ANDing 和 ORing 值的一些变体来获得 XOR 会产生的结果,但没有运气。我希望避免比较,但看起来我别无选择。

如果您有兴趣,可以查看 instruction set .

顺便说一句,这个 CPU 非常适合学习汇编。很好,很简单,而且足够慢(768kHz),机器语言明显比使用 BASIC 内置的计算机快;)我通常用 C/C++/Java 编程。 assembly 已经呼吸到了新鲜空气。

最佳答案

从 bool 代数我们知道:

A XOR B = (NOT(A) AND B) OR (A AND NOT(B))

更新 :
感谢@Brett Hale、@slebetman,因为 CPU 出人意料地不支持 NOT指令,它可以通过算术求反和减法来模拟,假设 2 的补码负数表示):
NOT(A) = (-1) - A

或者在不同的否定表示的情况下 -1可以替换为相应的存储类型最大值(即 8 位寄存器为 255 或 16 位寄存器为 65565)。

关于assembly - 如何在没有 XOR 指令的 CPU 上进行 XOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32018545/

相关文章:

assembly - x86 cmpl 和 jne

assembly - INT 10H 函数 06H 移动光标

c++ - 在函数中使用 asm,只用字节而不是指令名

assembly - 在这种情况下,OllyDbg 和 Assembler 中的 EBP+8 是什么意思?

c - 如何将寄存器的值从 ARM 汇编返回到 C 函数?

assembly - 优化 ARM Cortex M3 代码

c - HexRays - 输出读取了从未写入的值?

assembly - 两个 16 位数字的 GCD(最大公约数)

assembly - x86 汇编语言中常量字符串的声明

linux - IA 32 读取命令行参数