Если делитель является 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 или переполнение), третьего варианта нет.