assembly 无符号除法和有符号除法的结果有什么相似之处吗?

oogrdqng  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(170)

我有recently learned,对于m位x n位乘法(产生(m+n)位乘积),min(m,n)结果的最低有效位总是相同的,无论乘法是无符号还是有符号。
对于m位/n位除法(产生m位商和n位余数),是否有任何位对于无符号除法和有符号除法总是相同的,或者(对于某些输入)这两种除法方法产生完全不同的结果?

mklgxw1f

mklgxw1f1#

如果任何操作数设置了MSB(即为负),则无符号除法和有符号除法有明显不同。
如果两个操作数中的MSB都是零(即两个数字都是正数),则结果相同。
使用无符号除法时,操作数中的所有位都解释为无符号,即负数解释为(非常)大的整数。
div的结果:

mov  eax, 1
xor  edx, edx    
mov  ecx, -1
div  ecx      ; -> EAX = 0 because the -1 is interpreted as a large positive number
              ; -> EDX = 1

mov  eax, -1
xor  edx, edx
mov  ecx, 2
div  ecx      ; -> EAX = $7FFFFFFF because div 2 shifts bits right by 1.
              ; -> EDX = 1

使用有符号除法时,操作数首先转换为绝对数,然后将操作数的符号重新应用于除法结果。
idiv的结果:

mov  eax, 1
xor  edx, edx ; XOR because EAX is positive
mov  ecx, -1
idiv ecx      ; -> EAX = -1 because 1 / -1 = -1
              ; -> EDX = 0

mov  eax, -1
cdq           ; CDQ because EAX is negative
mov  ecx, 2
idiv ecx      ; -> EAX = 0 because 1 shr 1 = 0 and -0 is still 0
              ; -> EDX = -1

在一些处理器中,div(所有操作数都是正的)比idiv快一个周期,因为它需要做的“思考”更少。然而,考虑到除法是一个非常慢的操作,这几乎无关紧要。

huwehgph

huwehgph2#

你没有从前面的问题一中学到如何做吗?回到小学数学,长除法(这就是老/慢(许多时钟)除法的工作原理)。
让我们以位模式0 b10101010/0 b101为例,它要么是无符号的0xAA / 5,要么是有符号的-0x56 /-3。我不得不作弊,使用我的计算器。

-----------
101 ) 10101010

        100010
    -----------
101 ) 10101010
      101
      === 
        00101 
          101
          ===
            00

所以结果是0x 22
但是对于有符号除法,要得到正确答案,我们需要做无符号除法,这是小学时手工做的,然后在以后应用符号,所以我们不是将0 b101除以0 b10101010,而是将0 b11除以0 b1010110

11100  
    ---------
 11 ) 1010110
       11 
      ===
       100
        11
       ===
         11
         11
         ==
          010

所以答案是0x 1C余数0x 2因为两个都是负的所以结果是正的。
类似于加/减以及有符号和无符号乘法,你否定或不进去,否定或不出来,除法不像乘法,它只是相同的数字在移位后一遍又一遍地相加,你从左边开始,而不是右边,所以我看不出它如何在它们之间产生任何共同的模式。上面的例子证明了这一点,但也证明了如果你否定了一个,你会得到很多公共位,这可能是愚蠢的运气。
我不会尝试将位变量abc除以def,不像加/减和乘那样,它不会那样工作,这就是为什么有些处理器没有乘或除,或者有些处理器有乘但没有除,您可以通过使用大量逻辑使乘更快,除法也可能更快,或者使用大量时钟。
也许你可以看看Hackers Delight,看到除法的捷径,也许会出现一种模式,使某个百分比的位相同,但我怀疑,你必须让实际的二进制操作数进入除法逻辑,分子中的高位可能是相同的有符号或无符号,但这意味着它们是两个完全不同的数字。如上所述,如果您使用具有不同符号表示的相同位模式,并将这些相同的位模式输入unsigned或signed除法时,分子和/或分母中的位模式不同,因此结果不同,没有模式匹配。如果两个数字都是正数,那么两者应该给予相同的结果。

相关问题