Сборочные подразделения и плавающие точки - PullRequest
5 голосов
/ 28 декабря 2011
  mov eax, 0x01
  mov ecx, 0x02
  div ecx                 ; Divide AX/CX, saves remainder in DX
  cmp dx, 0
  je OddNumber
  int 80h

Когда я пытаюсь разделить 1/2, вместо перехода к метке OddNumber, он возвращает «Исключение с плавающей точкой».Я знаю, 1/2 - это поплавок, но как я могу справиться с этим?Спасибо.

GDB говорит: «Программа получила сигнал SIGFPE, Арифметическое исключение».кстати.

Ответы [ 2 ]

10 голосов
/ 28 декабря 2011
  1. Вам нужно обнулить edx перед вызовом div ecx.При использовании 32-битного делителя (например, ecx) div делит 64-битное значение в edx:eax на его аргумент, поэтому, если в edx есть мусор, он рассматривается как часть дивиденда.

  2. После div вы, вероятно, захотите сравнить edx, а не только dx.

1 голос
/ 28 декабря 2011

Ваш ответ, по-видимому, охватывается этим исключением с плавающей запятой, может означать деление на 0 сообщениеМожете ли вы взглянуть на то, что находится в edx до div?

...