在没有跳转的程序集中实现eq,lt gt

cul*_*hie 5 assembly bit-manipulation

是否可以仅使用AND,OR和NOT运算符编写逻辑来比较2个操作数并返回true/false(-1,0)而不使用跳转?如果是的话,请你给我一些提示,因为它对我来说是不可能的.我试图用"计算系统的元素"一书的汇编语言实现eq,lt和gt .

Mat*_*ery 5

如果仅使用按位逻辑运算符,并且在进位丢失的地方加/减,则无法从比较操作中获得-1或0(就此而言为1或0)的结果:

  • 对于位运算符,位ñ结果只取决于位ñ两个操作数。

  • 对于另外,考虑的二进制加法如何工作的:位Ñ结果可通过位的影响Ñ,和比特位的右边Ñ(经由携带),每个操作数的; 但不受操作数n位左侧任何位的影响。(您可以认为这是对观察值的概括,即两个偶数之和不能得出奇数。)

  • 作为一次性加入或按位运算从左侧位的任何信息不能传播Ñ操作数的进位Ñ结果,既没有能增加或按位OPS的任何组合物; 减法(这里假设2的补码)可以认为是这样的组合:xy = x +(NOt y)+1。

因此,对于2 == 2,您将无法获得0的结果,但是对于2 == 4,您将无法获得-1(或1),例如:每种情况下所需结果的位0不同,但结果只能取决于在两个操作数的位0上,每种情况下都相同。

如果您的true和false值仅在最高(即最左边)位不同,则可以这样做。

例如,使用8位值:将0x80表示为true,将0表示为false。然后x == y可以实现为(NOT((x - y) OR (y - x))) AND 0x80

如果将可用的运算扩展到包括右移,或者如果ADD运算可以产生进位,可以将其加回到结果的底部,则可以解决最初指出的问题。