8

我正忙于学习组装并正在考虑划分,但是我遇到了以下陈述:

mov edx,0x00000001
mov eax,0x00000000
mov ecx,0x00000002
idiv ecx

广发银行:

   0x08048071 <+17>:    mov    edx,0x1
   0x08048076 <+22>:    mov    eax,0x0
   0x0804807b <+27>:    mov    ecx,0x2
=> 0x08048080 <+32>:    idiv   ecx

我想将 0x100000000 除以 0x00000002,所以由于除法的跨度是 EDX:EAX,我将 0x1 移动到 EDX 并将 0x0 移动到 EAX。然后我将 0x2 移动到 ECX 并除以,不幸的是这给了我一个浮点异常,我不确定我做错了什么。

使用 div (无符号)时,它工作正常,所以我想知道 div 和 idiv 对于导致异常的特定语句的解释有什么区别。

4

1 回答 1

7

商 ( 0x80000000) 不适合 32 位有符号整数(最大值:0x7fffffff)。因此你得到一个例外。它确实适合 32 位无符号整数(最大值0xffffffff),因此无符号除法不会触发异常。

于 2013-03-24T18:48:05.360 回答