Что такое подписанное разделение (idiv) инструкция?

В инструкции Intel, idiv(целочисленное деление) означает подписанное деление.
Я получил результат idiv, но я не совсем понимаю результат.

- Пример

0xffff0000 idiv 0xffff1100


- Мой неверный прогноз
Насколько я знаю, quotient должно быть 0, и remainder должно быть 0xffff0000 и потому что...

0xffff0000 / 0xffff1100 = 0  
0xffff0000 % 0xffff1100 = 0xffff0000  


- Однако результат был...
Доidiv

eax            0xffff0000            # dividend
esi            0xffff1100            # divisor
edx            0x0                     

Послеidiv

eax            0xfffeedcc            # quotient
edx            0x7400   29696        # remainder


- вопрос
Результатом была ценность, которую я не мог ожидать.
Может ли кто-нибудь объяснить о подписанном делении (idiv)?


- добавлено. Вот больше информации оidiv,
idiv использует регистр eax в качестве исходного регистра.
В результате выполнения частное сохраняется в eax, а остаток сохраняется в edx.

1 ответ

Решение

idiv делит edx:eax на явный исходный операнд. См. Инструкцию по эксплуатации Intel.

Поскольку edx равно 0, edx:eax является положительным числом. Вы делите 4294901760 на -61184, давая -70196 с остатком 29696.

Помните, что и дивиденд (EDX:EAX), и делитель (ESI в вашем случае) интерпретируются как числа со знаком со знаком 2, так что любая битовая комбинация с установленным старшим битом является отрицательной.

00000000ffff0000 = 4294901760
ffff1100 = -61184
fffeedcc = -70196
7400 = 29696

Вы должны подписать расширение Eax в EDX, используя cdq перед использованием idiv вместо расширения нуля путем обнуления EDX.

Однако это все равно не даст ожидаемых результатов, поскольку -65536, деленное на -61184, равно 1 с остатком -4352.


(Отрицательный дивиденд и положительный делитель дают отрицательный остаток: знак остатка XIV IDIV зависит от знака дивиденда для 8/-3 и -8/3?)

Другие вопросы по тегам