Здравствуйте, VVVa, Вы писали:
VVV>с add и sub понятно — там отрицательные и положительные числа считаются одинаково... VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?
Зачем что-то куда-то переводить,
скажем работаем с 32битными числами, тогда -1 * 2 это 0xffffffff * 2,
перемножаем как безнаковые и получаем 0x1_ffff_fffe ,
отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe ,
а это как раз -2.
Здравствуйте, VVVa, Вы писали:
VVV>iMul возвращает в регистровой паре 32 бита источник а 64 бита результат — он что разширяет источник перед умножением по твоему?
а что, размножить старший бит в соседнее слово, это так сложно? конечно расширяет.
Здравствуйте, VVVa, Вы писали:
VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?
Здравствуйте, VVVa, Вы писали:
VVV>с add и sub понятно — там отрицательные и положительные числа считаются одинаково... VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает? VVV>с idiv тоже самое?
спросил у ИИ бота:
Команда imul — это команда, которая используется для создания пирожков из картошки. Она берет две картошки и помещает их в специальный прибор, который измельчает их и формирует пирожки. Вкус пирожков зависит от качества картошки и специй, которые добавляются в процессе их приготовления.
Команда idiv — это команда, которая используется для создания иллюзии летающей тарелки. Она запускает специальный генератор гравитационных волн, который создает иллюзию летающей тарелки в небе. Эта команда может быть использована для различных целей, например, для развлечения на вечеринках или для создания эффектов в киноиндустрии.
с add и sub понятно — там отрицательные и положительные числа считаются одинаково...
а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?
с idiv тоже самое?
Здравствуйте, Zhendos, Вы писали:
Z>отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe ,
Спасибо за пример... но это частный случай
iMul возвращает в регистровой паре 32 бита источник а 64 бита результат — он что разширяет источник перед умножением по твоему?
А деление не пояснишь?
Здравствуйте, Zhendos, Вы писали:
Z>Зачем что-то куда-то переводить, Z>скажем работаем с 32битными числами, тогда -1 * 2 это 0xffffffff * 2, Z>перемножаем как безнаковые и получаем 0x1_ffff_fffe , Z>отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe , Z>а это как раз -2.
подскажите как делит... вроде разширение разрядности не помогает ...
Здравствуйте, VVVa, Вы писали:
VVV>с add и sub понятно — там отрицательные и положительные числа считаются одинаково... VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?
Зачем?
На вики посмотри секцию Binary long multiplication -> Signed integers.
Точная реализация в современных процессорах скорее всего закрыта как корпоративный секрет, но не потому, что общий метод — он как раз именно такой: двумерная матрица ANDʼов аргументов и дерево сумматоров для результата — а из-за используемых методов (язык описания, тесты и всё такое).
Если у процессора умножение тратит тактов как 2-3 сложения — можешь к гадалке не ходить, там именно матрица и дерево сумматоров.
И вообще в этой статье полно полезных описаний, только их надо расшифровать.
Или тут неплохие диаграммки.
VVV>с idiv тоже самое?
Тоже не обязательно, хотя возможно — там некоторые вещи упростились бы.
В SRT (хоть базовом, хоть расширенном) можно привести хотя бы делитель к положительному, а можно не приводить, отработав возможность отрицательного в блоке принятия решения (0/+1/-1/etc.)
То что было в 8086 (который ещё проектировался вручную по каждому транзистору и вообще был жутко неэффективным) никак не обязано переноситься на современные процессоры
Здравствуйте, Zhendos, Вы писали:
Z>Здравствуйте, VVVa, Вы писали:
VVV>>с add и sub понятно — там отрицательные и положительные числа считаются одинаково... VVV>>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?
Z>Зачем что-то куда-то переводить, Z>скажем работаем с 32битными числами, тогда -1 * 2 это 0xffffffff * 2, Z>перемножаем как безнаковые и получаем 0x1_ffff_fffe , Z>отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe , Z>а это как раз -2.
Это только если согласны с результатом той же ширины, что аргументы.
Это самый частый случай, но не обязательный.