Ответ зависит от того, хотите ли вы увеличить ноль или подписать расширение значения, а также от того, можете ли вы или не можете использовать инструкции, доступные начиная с 80386. Для повышения производительности следует использовать код 80386 или новее, если movzx
иДоступно movsx
.
расширение нуля на 8086 или 80286
Обнуление верхней половины, затем переход к нижней половине.
xor bh, bh
mov bl, al
(Или эквивалентно,и более эффективен на некоторых более поздних процессорах: xor bx, bx
для обнуления целых 16 битов перед заменой младшего 8.) Знак
расширяется на 8086 или 80286
Без movsx
, вы, вероятно,хотите использовать cbw
, который работает только с AL
-> AX
. Самый простой способ переписать AH
перед копированием в BX
, поскольку ваше значение уже было в AL
.
cbw ; AH = 0 or 0xFF according to top bit of AL
mov bx, ax
Если вы хотите сохранить AH
, вы можете скопировать старый AX
сначала поменяйте местами после cbw
:
mov bx, ax ; save the old AH (and AL)
cbw ; sign-extend AL into AX
xchg bx, ax ; BX = sign-extended result, restore original AX
Сохранение инструкций на 8086 может включать планирование того, что вы храните в каком регистре, так что оно уже находится в нужном месте для такой инструкции, как cbw
или mul
, которая используетнеявный регистр. К 386 Intel добавила версии некоторых из них, которые работают с любым регистром.
ноль расширяется на 80386 или новее
Используйте movzx
.
movzx bx, al
Для лучшей производительности, расширение нуля до 32 бит.
movzx ebx, al
расширение знака на 80386 или новее
Использование movsx
, что похоже на cbw
, но работает для любых dst, src , даже включая источник памяти.
movsx bx, al
Если возможно, знак расширяется до 32 битдля лучшей производительности.
movsx ebx, al