这是一个更有趣的问题。我正在使用SC 61860 CPU,这是一个8位CPU,用于1987年的夏普PC-1360掌上电脑(也用于PC-1401和1403)。它的指令集实际上不包括XOR。它有AND,OR,比较,减法和加法指令。
我已经尝试了几种不同的AND和OR值来得到XOR会产生的结果,但没有运气。我希望避免比较,但看起来我没有选择。
如果你感兴趣,你可以看看instruction set(替代github和PC-1350 reference)。
顺便说一句,这款CPU非常适合学习汇编语言。它既漂亮又简单,而且速度足够慢(768 kHz),机器语言明显比使用BASIC内置的计算机快;)我通常用C/C++/Java编程。汇编语言是一股新鲜空气。
4条答案
按热度按时间efzxgjgh1#
从布尔代数我们知道:
字符串
更新:感谢@Brett黑尔,@slebetman,因为CPU令人惊讶地不支持
NOT
指令,它可以通过算术否定和减法来模拟,假设2的补码否定表示):型
或者在不同的否定表示的情况下,
-1
可以由相应的存储类型最大值(即,对于8位寄存器为255,对于16位寄存器为65565)替换。wh6knrhe2#
正如@harold指出的,
a ^ b = (a | b) - (a & b)
。这也是对异或的一个回答,只有或和与-并集减去交集,没有借位。
这个运算集只能与内存目标(或与累加器中的立即数)进行AND或OR运算,而不能在它的主要和次要运算符(
A
和B
)之间进行AND或OR运算。看起来访问B
的指令只是将其视为B:A中16位整数的高半部分,将B与A交换,或将其增加/减少。所以我们需要在
P
指向的“内部”RAM中有一些暂存空间,因为ANMA
[P] and A -> [P]
是唯一的按位AND,其中两个操作数都是运行时变量,而不是立即数。(否则我们需要自修改代码。)对于or
和ORMA
相同(或存储器累加器;[P] |= A
)。实际上减法(-
)也是一样的;两个寄存器值之间也没有加/减,只有内部存储器。字符串
注解重申了指令的作用,因为我以前从未使用过这个伊萨;它通常不是一个好的注解风格。(通常你想描述每条指令实现的更高级别的东西。)
阅读
[DP]
两次感觉很浪费,但“外部”内存并不慢(mvmd
是1字节,3个周期,与RMW内部内存的指令相同),我认为避免它会花费更多的指令。除了film
之外,没有一条指令可以执行[P] = A
,它需要重复计数来填充内存,和exam
交换。所以要复制,我想可以用exam
;ldm
来做,它比anma
;orma
稍微快一点。感觉很奇怪,ldm
没有像std
([DP] = A
)那样的逆方向。帕特里克实现
(x+y) - 2*(x&y)
的版本是21条指令(包括rtn
和一些指针设置,用于将DP指向一个输入和一个DP输出,这是我已经假设的。(包括rtn
)全部为单字节,但我认为这主要是由于选择使用2字节的内部内存作为临时空间,而不是1字节,而不是push/pop和exchanges,并在寄存器和已经设置的指针中获取输入。(计数字节或周期比指令更有用,但会花费更多精力。)使用3周期
SBM
进行两次减法,或者在SBM
之前使用SL
指令进行左移,也可以提高帕特里克代码的效率和大小。(存储器范围内的BCD操作或16位加法/减法除外),所以我认为这两个表达式的最佳实现是相同的,除了(x+y) - 2*(x&y)
多了一个sl
。除非self-修改代码更好。使用
film
(I=1),用A
的副本填充2个字节的内存是有用的还是更好的?型
所以不,这很糟糕,
lii 1
是2字节,film
比大多数都慢。suzh9iv83#
按位OR也可以由以下操作代替
字符串
如在此stackoverflow answer中针对类似问题所解释的。
下面是一个实现的代码示例(未测试):
型
编辑:如果我使用Peter Cordes的回答的前提条件和风格,我的公式如下:
型
编辑2:夏普ESR-H SC 61860 µ-控制器的一个困难是它几乎没有文档记录。好的参考文献很少,而且往往不完整或包含错误。
我使用以下网站作为参考:
hrirmatl4#
太棒了!谢谢,效果很好。
字符串
下面是使用8位寄存器的程序。要一起使用2个寄存器,如AND,您必须将P指向第二个寄存器。然后您可以[P]和A -> P:
型