Откуда вы знаете, что когда 'mul ecx' был выполнен. ECX будет умножаться на EAX? А не с EBX или EDX?
mul ecx, eax
хотя было бы больше смысла.
Откуда вы знаете, что когда 'mul ecx' был выполнен. ECX будет умножаться на EAX? А не с EBX или EDX?
mul ecx, eax
хотя было бы больше смысла.
Набор инструкций просто определяется таким образом.
Intel могла бы определить его по-другому, включая способы, которые позволили бы вам полностью указать входные и выходные регистры, но они этого не сделали.
Возможно, оправдание состоит в том, что в то время, когда различные инструкции умножения были добавлены в набор инструкций ЦП (я думаю, 8086 года выпуска), что в существующей инструкции не было очевидных мест для размещения умножения, где оно могло бы использовать общее декодирование. схема, доступная для других инструкций (например, mov, add, xor и т. д.), что было не так много доступных транзисторов для выполнения причудливых схем декодирования, позволяющих каким-то другим способом кодировать общие операнды, и что любые доступные транзисторы были лучше посвященный логике умножения/деления.
Наконец, инструкция умножения требуется гораздо реже, чем общие инструкции (mov, add, xor), и поэтому усилия по перемещению операндов на место/результатов из фиксированных мест не вызывают большого раздувания кода или большого влияния на производительность. Разработчики нашли способ включить исходный операнд. Вы должны считать, что вам повезло, что это не было просто определено как умножение EAX и EDX для получения EDX:EAX, что является проверенной временем схемой, используемой во многих более ранних компьютерных архитектурах. С тех пор потребности в целочисленном умножении в наборе инструкций x86 не сильно изменились.
Арифметика с плавающей запятой/вектором — это совсем другое дело.
mulx
. - person Brett Hale   schedule 24.07.2013mul ecx, eax
не указывает на верхнюю половину неявного вывода, EDX. - person Peter Cordes   schedule 24.12.2020