Есть ли способ, что мы можем переписать ниже операции сборки, используя только Mov инструкциюКак я могу написать эту сборочную линию по-другому?
movzx eax, WORD [short_temp]
Есть ли способ, что мы можем переписать ниже операции сборки, используя только Mov инструкциюКак я могу написать эту сборочную линию по-другому?
movzx eax, WORD [short_temp]
Конечно, легко. Просто обнулить eax
и установить ax
потом:
XOR EAX, EAX
MOV AX, [short_temp]
Если вы хотите, чтобы получить слово из [EAX]
как вы сказали here, просто хранить адреса в какой-то другой регистр заранее:
MOV EBX, EAX
XOR EAX, EAX
MOV AX, [short_temp]
или, если что это не возможно, то, как @fuz proposed и очистить верхние 16 бит EAX
с помощью AND
:
MOV AX, [EAX]
AND EAX, FFFFh
Вам не нужно избегать movzx
. Если доступны 32-битные регистры, такие как EAX, то ваш код работает на 386 или позже, поэтому поддерживается movzx
.
Это, безусловно, самый эффективный способ сделать это на процессоре Intel. movzx r32, [memory]
декодирует только нагрузку uop без работы ALU. Задержка такая же, как и нормальная нагрузка (IIRC), поэтому нулевое расширение выполняется свободным блоком нагрузки.
На центральном процессоре AMD Bulldozer movzx
всегда использует порт ALU (а также порт загрузки, когда он является операндом памяти), поэтому теоретически он может быть быстрее для xor-zero EAX перед использованием текстовой нагрузки (@ Ответ Downvoter). Это может дать вам одну задержку нагрузки на один цикл за счет увеличения размера кода и более m-op для декодирования интерфейса.
Другие предложения, такие как выполнение текстовой нагрузки в AX, а затем and eax, 0xFFFF
, явно хуже, потому что они читают EAX после записи с частичным регистром (AX) и потому что это отдельная операция ALU, которая добавляет еще один цикл задержки. (xor-zeroing avoids the partial-register penalty, даже на процессорах семейства Intel P6.)
Несмотря на то, что вы не можете использовать 2 команды _mov_. 'mov eax, 0'' mov ax, [short_temp] '. Есть лучшие способы, если ваш вопрос не нужно толковать буквально (например, используя _only_ mov) –