Ваша функция выглядит немного сложной для меня. idiv
работает, как и ожидалось, с этой функцией:
_mydiv:
xor %rdx, %rdx ; clear high bits of dividend
mov %rdi, %rax ; copy dividend argument into rax
idiv %rsi ; divide by divisor argument
ret ; return (quotient is in rax)
В переводе на синтаксис NASM и на окна ABI, я думаю, это будет что-то вроде:
_mydiv:
mov r8, rdx ; copy divisor argument to scratch register
xor rdx, rdx ; clear high bits of dividend
mov rax, rcx ; copy dividend argument into rax
idiv r8 ; divide by divisor in scratch register
ret ; return (quotient is in rax)
Возможно, вы попираете свои параметры и что-то путаете?
Редактировать: глядя на ваш код, мне приходит в голову, что он может вообще не быть написан как правильная функция. Важные шаги:
- Поместите дивиденд в RDX: RAX - для вас это, вероятно, означает очистку RDX и помещение входного дивиденда в RAX.
- Поместите делитель в какой-то другой регистр - вы выбрали RCX, это должно быть хорошо.
- Разделить -
idiv rcx
.
- Результат будет в формате RAX.
Вы должны обратить особое внимание на шаг 1 - убедитесь, что RDX: RAX имеет нормальное содержимое! Почему вы получаете исключение с плавающей запятой, я не могу понять из кода, который вы показали.