Assembly 对160位值求反

Assembly 对160位值求反,assembly,x86,Assembly,X86,我正在研究汇编,昨天发现了一个求160位值的反的代码(确切地说,我在这里找到了->) 它是: 我不知道我是否在汇编方面做得不够好,或者这段代码包含一些错误。看第六行(从第一个mov操作开始计数): 第六行不应该是这样的吗: mov Value+4, eax 我不明白为什么我们只将eax的低16位移动到Value,为什么它直接移动到Value+8而不是Value+4 有人能解释一下吗?是的,第6行必须如您所建议的那样,下面所有的“ax”必须是“eax”: 以下是FASM语法中的正确代码:

我正在研究汇编,昨天发现了一个求160位值的反的代码(确切地说,我在这里找到了->)

它是:

我不知道我是否在汇编方面做得不够好,或者这段代码包含一些错误。看第六行(从第一个mov操作开始计数):

第六行不应该是这样的吗:

mov     Value+4, eax
我不明白为什么我们只将eax的低16位移动到Value,为什么它直接移动到Value+8而不是Value+4


有人能解释一下吗?

是的,第6行必须如您所建议的那样,下面所有的“ax”必须是“eax”:

以下是FASM语法中的正确代码:

            mov     eax, 0
            sub     eax, [Value]
            mov     [Value], eax
            mov     eax, 0
            sbb     eax, [Value+4]
            mov     [Value+4], eax
            mov     eax, 0
            sbb     eax, [Value+8]
            mov     [Value+8], eax
            mov     eax, 0
            sbb     eax, [Value+12]
            mov     [Value+12], eax
            mov     eax, 0
            sbb     eax, [Value+16]
            mov     [Value+16], eax
mov eax,0
替换为
mov eax,edx
,并以多使用一个寄存器的价格,将使某些CPU上的代码更小,速度更快一些:

            xor     edx, edx
            xor     eax, eax
            sub     eax, [Value]
            mov     [Value], eax
            mov     eax, edx
            sbb     eax, [Value+4]
            mov     [Value+4], eax
            mov     eax, edx
            sbb     eax, [Value+8]
            mov     [Value+8], eax
            mov     eax, edx
            sbb     eax, [Value+12]
            mov     [Value+12], eax
            mov     eax, edx
            sbb     eax, [Value+16]
            mov     [Value+16], eax

那是一只虫子。你是对的。在接下来的几行中:
ax
应该是
eax
。不,“some\u ONE”的例子比你的要复杂得多。请记住,CPU在
not
指令读取RAM时,取反值并将值写回RAM,在
adc
指令时,情况类似,因此我们一步读取2次,写入2次。在“some_ONE”示例中,我们每个步骤只访问RAM两次,一次读取,一次写入。测试两个示例。你的例子慢了大约40%@GJ。是的,你说得对。根据测试编辑答案。:)您的第二个示例是错误的,因为
xor
指令修改进位标志,所以您只能在第一行中使用
xor eax,eax
。@GJ.:是的,它是错误的:(但我还是不喜欢
mov reg32,const
。这个版本怎么样?;)
            mov     eax, 0
            sub     eax, [Value]
            mov     [Value], eax
            mov     eax, 0
            sbb     eax, [Value+4]
            mov     [Value+4], eax
            mov     eax, 0
            sbb     eax, [Value+8]
            mov     [Value+8], eax
            mov     eax, 0
            sbb     eax, [Value+12]
            mov     [Value+12], eax
            mov     eax, 0
            sbb     eax, [Value+16]
            mov     [Value+16], eax
            xor     edx, edx
            xor     eax, eax
            sub     eax, [Value]
            mov     [Value], eax
            mov     eax, edx
            sbb     eax, [Value+4]
            mov     [Value+4], eax
            mov     eax, edx
            sbb     eax, [Value+8]
            mov     [Value+8], eax
            mov     eax, edx
            sbb     eax, [Value+12]
            mov     [Value+12], eax
            mov     eax, edx
            sbb     eax, [Value+16]
            mov     [Value+16], eax