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)