Assembly 在装配中执行eq、lt和gt,无跳跃

Assembly 在装配中执行eq、lt和gt,无跳跃,assembly,bit-manipulation,nand2tetris,Assembly,Bit Manipulation,Nand2tetris,是否可以只使用AND、OR和NOT运算符编写逻辑,以比较2个操作数并返回真/假(-1,0),而不使用跳转? 如果是这样的话,你能给我一些提示吗?因为我觉得这是不可能的。 我试图在本书的汇编语言中实现eq、lt和gt 如果a和b相等,则结果为0,否则结果为非零 SUB a, b AND a, SIGN_BIT (其中符号位是除去除……符号位以外的所有内容的掩码) 如果a大于b,则结果为零;如果a小于或等于b,则结果为非零(假设2是完全的)。如果这是一个纯粹的理论问题:由于您在有限的操作数集上操作

是否可以只使用AND、OR和NOT运算符编写逻辑,以比较2个操作数并返回真/假(-1,0),而不使用跳转? 如果是这样的话,你能给我一些提示吗?因为我觉得这是不可能的。 我试图在本书的汇编语言中实现eq、lt和gt

如果a和b相等,则结果为0,否则结果为非零

SUB a, b
AND a, SIGN_BIT
(其中符号位是除去除……符号位以外的所有内容的掩码)


如果a大于b,则结果为零;如果a小于或等于b,则结果为非零(假设2是完全的)。

如果这是一个纯粹的理论问题:由于您在有限的操作数集上操作,所有可能的函数都可以仅使用or、and和NOT来表示

有关详细说明,请参阅

从实用的角度来看,Anon的答案更有用:-)

编辑:即使我的理论答案也可能不正确:将析取范式应用于该问题将需要移位操作,因为输出字的每一位都依赖于输入位的所有位。我还没有弄清楚如何使用AND、OR、not和算术实现移位(我也不确定这是否可能…)


虽然我离开这篇文章是作为过早回答的负面例子…

x86 CPU从历史上的某一点开始就有“条件移动”操作。

A等于B可以用xor表示:

(A AND (NOT B)) OR ( A AND (NOT B))
如果A==B和其他东西!=如果不是,则为0

对于小于B的A,您可以使用 (A-B和标志牌)

,其中符号掩码屏蔽除符号位以外的所有内容,将为您提供最大负整数的真值和0的假值


如果仅使用位逻辑运算符,并且在进位丢失的位置进行加法/减法运算,则不可能从比较运算中获得-1或0(或1或0)的结果:

  • 对于按位运算符,结果的位n仅取决于两个操作数的位n

  • < L>>P>加法,考虑二进制加法是如何工作的:结果的位N可能受位n的影响,并且每个操作数的位N位(通过载)的位;但不能受操作数中位n左侧的任何位的影响。(你可以认为这是一个概括的结论,即增加两个偶数不能给出奇怪的结果。)

  • 由于单个加法或按位运算不能将任何信息从操作数的第n位左侧传播到结果的第n位,因此加法或按位运算的任何组合也不能传播;减法(这里假设2的补码)可以被认为是这样的组合:x-y=x+(不是y)+1

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

如果真值和假值仅在顶部(即最左侧)位不同,则可以执行此操作

例如,对于8位值:使用0x80表示真,使用0表示假;然后
x==y
可以实现为
(而不是((x-y)或(y-x)))和0x80


如果将可用操作扩展到包括右班,则可以解决最初所述的问题,或者,如果加法运算可以产生一个进位,该进位可以加回到结果的底部。

您所说的汇编语言中的所有算术运算都有可能根据运算结果(=0?和>0?)进行条件跳转,它可以用来获得所需的布尔结果。

我们正在阅读同一本书,只是碰到了这个问题

我们能找到的最佳解决方案是生成唯一的标签,然后使用JEQ命令跳转到预期的标签,然后在完成后跳转到更下方的标签

伪代码:

if they're equal, jump to EQUAL

// not equal section
push constant false
jump to DONE

// equal section
(EQUAL)
push constant true

// done section
(DONE)

是如何具体实现的(在Ruby中)。

是否真的需要只使用and,还是不使用and?因为你通常需要像sub这样的东西(这在技术上可以通过所提到的运算符来表达,但是手动横切进位会有点麻烦。如果您允许使用子运算符和移位运算符,它会变得相对容易。您是否也需要处理负数?对不起,是的,是的,您可以对寄存器、汇编ALU进行加减和赋值。)计算是0,1-1,x,y,不是x,不是y,-x,-y,x+1,y+1,x-1,x+y,x-y,y-x,x和y,x或y你用的是哪种汇编语言?你用的是哪种汇编语言?这是来自这本书:谢谢。我遇到的问题是,输出必须是-1或0,我能够在测试为真的地方输出-1,但如果结果为假,我就可以输出-1如您所说,e输出将是“某物”。我希望能够将此某物强制为0,如果它不是-1请注意,如果减法溢出=/最大值的算术右移将导致-1,如果输入为负,则为0。谢谢,我如何将!=0转换为确定值ue(比如1)对于!=0不是0的所有情况。这是甲烷储存的绊脚石,我认为这是一个很好的答案,非常清楚和可以理解。你可以通过移位来实现,移位也是按位的。不幸的是,这在问题中是不允许的
if they're equal, jump to EQUAL

// not equal section
push constant false
jump to DONE

// equal section
(EQUAL)
push constant true

// done section
(DONE)