2013-03-24 12 views
8

jestem zajęty uczenia Montaż i patrzył na podzielenie jednak wpadłem na zalewie z następującym stwierdzeniem:wyjątkowy zmiennoprzecinkowy po podzieleniu na x86 NASM

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 

Chciałem podzielić 0x100000000 przez 0x00000002, więc ponieważ zakres podziału to EDX: EAX, przeniosłem 0x1 do EDX i 0x0 do EAX. Następnie przenoszę 0x2 do ECX i dzielę, to niestety daje mi wyjątek zmiennoprzecinkowy, nie jestem pewien, co zrobiłem źle.

Używając div (unsigned) działa normalnie, więc zastanawiam się, jaka jest różnica w interpretacji div i idiv dla tego konkretnego zdania, które powoduje wyjątek.

Odpowiedz

7

Iloraz (0x80000000) nie pasuje do 32-bitowej liczby całkowitej ze znakiem (wartość maksymalna: 0x7fffffff). Dlatego otrzymujesz wyjątek. To do mieści się w 32-bitowej liczbie całkowitej bez znaku (wartość maksymalna 0xffffffff), więc żaden wyjątek nie jest wyzwalany przez unsigned divide.

+0

Oczywiście zapomniałem, że mogę podpisać tylko 2147483647. Głupi błąd, dzięki :) –

Powiązane problemy