我正在研究装配,昨天找到了一个否定160位值的代码(我确实在这里找到了它 - > https://courses.engr.illinois.edu/ece390/books/artofasm/CH09/CH09-5.html)。
它' S:
Value dword 0,0,0,0,0 ;160 bit integer.
.
.
.
mov eax, 0
sub eax, Value
mov Value, eax
mov eax, 0
sbb eax, Value+4
mov Value+8, ax
mov eax, 0
sbb eax, Value+8
mov Value+8, ax
mov eax, 0
sbb eax, Value+12
mov Value+12, ax
mov eax, 0
sbb eax, Value+16
mov Value+16, ax
我不知道我是否在组装时不够好或者这段代码包含一些错误。看第6行(从第一个 mov 操作算起):
5. sbb eax, Value+4
6. mov Value+8, ax
第6行不应该是这样的:
mov Value+4, eax
我不知道为什么我们 mov 只将低16位的eax转换为Value以及为什么它直接转移到Value + 8而不是Value + 4。< / p>
任何人都能解释一下吗?
答案 0 :(得分:1)
是的,第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