Что такое подписанное разделение (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?)