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