Nasm Idiv отрицательное значение - PullRequest
1 голос
/ 31 января 2012

Попытка разделить положительное число на отрицательное число.

В настоящее время моя программа разделится корректно, и я могу правильно получить доступ к остатку.

Но когда я ввожу положительное число, деленное на отрицательное значение, оно вообще не будет делиться.

Я знаю, что есть способ "подписать расширение", и он будет делиться правильно. Я просто не понимаю руководство

movsss $ imm /% reg% reg / mem move, расширение знака 231 movzss $ imm /% reg% reg / mem move, расширение нуля

конечно, это синтаксис att, мне нужен синтаксис intel

вот мой код

xor rdx, rdx
mov rax, [input]
mov rcx, [input2]
idiv rcx

Идеи о том, как делить на отрицательные?

1 Ответ

4 голосов
/ 31 января 2012

Если делитель является 64-битным значением со знаком, вам не нужно ничего с ним делать.Аналогичным образом, если дивиденд является 128-разрядным значением со знаком, вам не нужно ничего с ним делать, просто загрузите его старшие 64 бита в rdx и младшие 64 бита в rax.

Теперь, если какое-либо число подписано, но короче, чем ожидает idiv, вам нужно продлить это число.Расширение знака очень просто.Вы просто заполняете пустые верхние биты старшим значащим битом (знаковым битом) вашего номера.Для неотрицательных чисел вы заполняете это пространство 0, а для отрицательных чисел вы заполняете его 1.Есть несколько доступных инструкций, которые могут подписать расширение значения, которое в данный момент хранится в аккумуляторе.Это: cbw, cwde, cdqe, cwd, cdq, cqo.Последние три знака распространяются на dx/edx/rdx.Скорее всего, вам нужно cqo вместо xor rdx, rdx, например:

mov rax, [input]
cqo ; sign extends rax into rdx:rax
mov rcx, [input2]
idiv rcx

Что касается 'Но когда я ввожу положительное число, деленное на отрицательное значение, оно вообще не будет делиться' , этого не может быть.Он либо делит, либо вызывает исключение деления (деление на 0 или переполнение), третьего варианта нет.

...