Что такое подписанное разделение (idiv) инструкция? - PullRequest
0 голосов
/ 02 января 2019

В инструкции 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 Ответ

0 голосов
/ 02 января 2019

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.


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

...