MOV от 8 бит до 16 бит регистра (от al до bx)

Как я могу исправить проблему с перемещением 8-битного значения в регистр BX (16 бит)?

mov al, 10h
mov bx, al

за это я получаю:

operands do not match: 16 bit and 8 bit register 

1 ответ

Решение

Ответ зависит от того, хотите ли вы расширить значение нулями или знаками, а также от того, можете ли вы использовать инструкции, доступные начиная с 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

Другие методы: установка верхней половины с помощьюneg/sbbтакже возможны, как и арифметические сдвиги или логические сдвиги для знакового или нулевого расширения. (Особенно, если ваше значение началось в регистре типа AH). См. Сборку MASM, перемещающую 8-битный регистр в 16-битный регистр (например, mov cx, ch)

Другие вопросы по тегам