"翻转位并加1"可以完成2的补码。因此,最朴素的实现方式为(4条指令和14字节的代码):
NOT RAX
NOT RDX
ADD RAX,1 ; Can't use INC, it doesn't set Carry
ADC RDX,0
当我使用NEG指令替换NOT指令对RAX进行操作时,它为我执行了“+1”的操作,但进位标志是错误的。NEG RAX会在RAX为零时清除进位标志,但我只需要在此情况下保留进位标志。因此,下一个最好的方法可能是(4条指令和11个字节的代码):
NOT RDX
NEG RAX
CMC
ADC RDX,0 ; fixed, thanks lurker
仍然是4条指令。但是我可以使用减法-1,而由于SBB将进位位添加到被减数中,当进位标志清除时,我将添加+1。因此,我的下一个最佳尝试是这个,只需3条指令和10字节的代码:
NOT RDX
NEG RAX
SBB RDX,-1
从我冗长的文本中可以看出,这并不容易理解。在汇编语言中有更好、更易懂的方法来实现级联2的补码吗?
ADC
通过标志位依赖于NOT
/ADD
,依赖于NOT
。2:ADC
依赖于NOT
/CMC
依赖于NEG
。3:SBB
依赖于NOT
/NEG
。我认为你已经找到了一个非常聪明的方式来制作最后一个版本。 - EOF