Набор инструкций Intel: умножить на EAX, EBX, ECX или EDX?

Откуда вы знаете, что когда 'mul ecx' был выполнен. ECX будет умножаться на EAX? А не с EBX или EDX?

mul ecx, eax

хотя было бы больше смысла.


person user2453180    schedule 24.07.2013    source источник
comment
RTFM — это то, откуда вы знаете :) 2   -  person Hans Passant    schedule 24.07.2013
comment
Это связано с 25-летним 32-битным расширением 35-летней 16-битной архитектуры. Архитектура Haswell имеет более «современную» инструкцию mulx.   -  person Brett Hale    schedule 24.07.2013
comment
если вы посмотрите на некоторые архитектуры на основе стека или архитектуры с накопленным регистром, вы увидите, что стек или накопленный регистр почти всегда подразумевается в инструкции. Просто потому, что кодировка для инструкции была невозможна/не нужна   -  person phuclv    schedule 20.06.2015
comment
Предлагаемый вами синтаксис mul ecx, eax не указывает на верхнюю половину неявного вывода, EDX.   -  person Peter Cordes    schedule 24.12.2020


Ответы (1)


Набор инструкций просто определяется таким образом.

Intel могла бы определить его по-другому, включая способы, которые позволили бы вам полностью указать входные и выходные регистры, но они этого не сделали.

Возможно, оправдание состоит в том, что в то время, когда различные инструкции умножения были добавлены в набор инструкций ЦП (я думаю, 8086 года выпуска), что в существующей инструкции не было очевидных мест для размещения умножения, где оно могло бы использовать общее декодирование. схема, доступная для других инструкций (например, mov, add, xor и т. д.), что было не так много доступных транзисторов для выполнения причудливых схем декодирования, позволяющих каким-то другим способом кодировать общие операнды, и что любые доступные транзисторы были лучше посвященный логике умножения/деления.

Наконец, инструкция умножения требуется гораздо реже, чем общие инструкции (mov, add, xor), и поэтому усилия по перемещению операндов на место/результатов из фиксированных мест не вызывают большого раздувания кода или большого влияния на производительность. Разработчики нашли способ включить исходный операнд. Вы должны считать, что вам повезло, что это не было просто определено как умножение EAX и EDX для получения EDX:EAX, что является проверенной временем схемой, используемой во многих более ранних компьютерных архитектурах. С тех пор потребности в целочисленном умножении в наборе инструкций x86 не сильно изменились.

Арифметика с плавающей запятой/вектором — это совсем другое дело.

person Ira Baxter    schedule 24.07.2013
comment
Почему не «mul ecx, eax»? - person user2453180; 31.07.2013
comment
В инструкции есть только биты для представления одного операнда. Вы можете написать mul ecx или mul eax, но не то и другое одновременно. - person Ira Baxter; 01.08.2013