2013-11-16 1 views
0

Для простого тестового примера для моего проекта компилятора я пытаюсь разделить 88 на 11, но когда я звоню idivq, моя программа выдает исключение с плавающей запятой. Вот соответствующий раздел сгенерированного кода, где происходит исключение:Простой раздел x86-64 не работает

# push 88 
movq $88,%r10 

# push 11 
movq $11,%r13 

# \ 
movq %r10,%rax 
idivq %r13 

Я посмотрел примеры того, как использовать div, и я думал, следующий в том же формате, так что я не понимаю, почему я получая исключение.

+0

Возможный дубликат http://stackoverflow.com/questions/10343155/x86-assembly-handling-the-idiv-instruction – Leeor

+0

Ваш idivq делит rdx: rax на r13. Не устанавливая rdx, вы можете легко вызвать ловушку #DE. Как это порождает «исключение с плавающей точкой», трудно догадаться. –

ответ

4

idiv конкатенирует rdx и rax перед выполнением разделения (то есть на самом деле это 128-разрядное деление). Если вы хотите сделать однословное деление, поместите нуль в rdx. То, что вы получаете, не исключение FP, а исключение целочисленного переполнения: в rdx есть что-то, что делает слишком большое значение для размещения в регистре назначения.

+0

Хорошо, это имеет смысл из документов, которые я читал. Спасибо – Otto45

+0

@ Отто45, пожалуйста, примите его ответ в этом случае. благодаря! –

+1

'idiv' является подписанным делением, поэтому обнуление' rdx' является правильным только в том случае, если дивиденд положителен. В общем, 'rax' должен быть расшифрован в' rdx' (например, 'movq% rax,% rdx/sarq $ 63,% rdx'). – gsg

 Смежные вопросы

  • Нет связанных вопросов^_^