Архитектура x86 не устанавливает, что каждая инструкция aritmetic/logic должна иметь свои операнды в регистрах. На самом деле оба операнда могут быть регистром, один из которых является регистром, а другой - эффективным адресом операнда совпадающего размера в памяти или промежуточным значением.
Итак, когда выполняется инструкция MUL, отличная от той, которая умножает два регистра, она просто берет свои операнды из любого места, где бы они ни находились, помещала их во внутренние (не доступные для программиста) регистры и выполняла операцию.
Точная процедура отличается от каждой эволюции архитектуры x86. Некоторые процессоры выполняют переименование регистров: они имеют множество внутренних регистров и назначают их динамически операндам инструкций, просто отправленных на исполнение. Другие используют то, что они называют «станциями резервирования» (алгоритм Томасуло), в котором хранятся операнды, ожидающие наличия функционального блока.
@stuartd: Я просмотрел этот пост, он просто говорит, что mul не работает с немедленным значением. –
он не «проходит через регистр». Значение отправляется в ALU вместе с тем, с чем он будет умножаться, что зависит от ширины бита var1. Однако обратите внимание, что это недопустимо «mul word 3», однако, если у вас есть адрес mem, в котором находится 3, вы можете сделать «mul word [varThatEqualsThree]». Захватите руководство по использованию intel здесь: [Intel 64 и IA-32 Architectures Software Developer's ...] (http://www.intel.com.au/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer -instruction-set-reference-manual-325383.pdf) – enhzflep