8

私はアセンブリの学習で忙しく、分割を検討していましたが、次のステートメントでピクルスに遭遇しました。

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

GDB:

   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(unsigned)を使用すると正常に動作するため、例外の原因となるこの特定のステートメントのdivとidivの解釈の違いは何でしょうか。

4

1 に答える 1

7

商(0x80000000)は32ビットの符号付き整数(最大値:)に適合しません0x7fffffff。したがって、例外が発生します。32ビットの符号なし整数(最大値)に収まるため、符号なし除算によって例外がトリガーされることはありません0xffffffff

于 2013-03-24T18:48:05.360 に答える