2015-10-14 6 views
0

Я начинаю ASM, я знаю, что команда mul работает только с регистром или памятью;Как работает инструкция mul в случае: 'mul mem'? (x86)

Теперь, когда мы используем: mul var1, как извлекается значение var1? Я думаю, что сначала он должен пройти регистрацию, верно? но в этом случае, что происходит, если все регистры заняты?

+0

@stuartd: Я просмотрел этот пост, он просто говорит, что mul не работает с немедленным значением. –

+0

он не «проходит через регистр». Значение отправляется в 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

ответ

1

Архитектура x86 не устанавливает, что каждая инструкция aritmetic/logic должна иметь свои операнды в регистрах. На самом деле оба операнда могут быть регистром, один из которых является регистром, а другой - эффективным адресом операнда совпадающего размера в памяти или промежуточным значением.

Итак, когда выполняется инструкция MUL, отличная от той, которая умножает два регистра, она просто берет свои операнды из любого места, где бы они ни находились, помещала их во внутренние (не доступные для программиста) регистры и выполняла операцию.

Точная процедура отличается от каждой эволюции архитектуры x86. Некоторые процессоры выполняют переименование регистров: они имеют множество внутренних регистров и назначают их динамически операндам инструкций, просто отправленных на исполнение. Другие используют то, что они называют «станциями резервирования» (алгоритм Томасуло), в котором хранятся операнды, ожидающие наличия функционального блока.

+0

«он просто берет свои операнды откуда бы они ни были, помещает их во внутренние регистры». В этом случае, почему бы не позволить «mul» принять немедленное значение, поместить непосредственное значение во внутренний регистр, а после выполнения операции mul очистит свои внутренние регистры? –

+0

Кто говорит, что так не происходит? Но, во всяком случае, зачем вам процессор, чтобы очистить внутренний регистр после выполнения операции? Обычно регистр имеет значение, пока не потребуется, чтобы оно имело другое значение. –

+0

спасибо, я просто не понимаю, если он работает таким образом, почему мы не можем выполнить: mul imm? (немедленно). «Я просто преподавал об очистке, потому что этот процесс произойдет скоро или позже, и поскольку внутренние регистры недоступны программисту, резервирование ценностей там не приносит никакой пользы». –

1

Названные регистры предназначены для хранения значений между инструкциями, ALU имеет внутренние регистры, где значения сохраняются до тех пор, пока на них не будет выполнена операция.

Значение не должно переходить из памяти в регистр, а затем в ALU, оно может перейти непосредственно из памяти в ALU.

Смежные вопросы