否定160位值

时间:2015-04-21 10:14:30

标签: assembly x86

我正在研究装配,昨天找到了一个否定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>

任何人都能解释一下吗?

1 个答案:

答案 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