- нельзя осуществить пересылку из одной области памяти в другую
mov Per1, Per2
illegal memory reference
need register in expression
Þ Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.
mov ax, Per2
mov Per1, axФрагмент программы
masmmodel small.datax db 5y db?.codestart:... mov al,x mov y,al...end start- нельзя загрузить в сегментный регистр значение непосредственно из памяти
Þ Поэтому для выполнения такой загрузки нужно использовать промежуточный объект.
Это может быть регистр общего назначения или стек.
mov ax, Perem mov ds, axСтандартное начало программы
masmModel small.stack 100h.data <описание данных>.codestart: mov ax,@data;@data - переменная mov ds,ax <команды> mov ax,4c00h int 21hend start- нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр.
Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает.
Þ Выполнить такую пересылку можно, используя в качестве промежуточных все те же регистры общего назначения.
|
|
- нельзя использовать сегментный регистр cs в качестве операнда назначения.
Причина здесь простая. Дело в том, что в архитектуре микропроцессора пара cs:ip всегда содержит адрес команды, которая должна выполняться следующей.
Þ Изменение командой mov содержимого регистра cs фактически означало бы операцию перехода, а не пересылки, что недопустимо.
Совет
желательно использовать в качестве одного из операндов регистр al/ax/eax
в этом случае TASM генерирует более быструю форму команды mov
mov al,5 mov bl,alКоманда XCHG (eXCHanGe)
Для двунаправленной пересылки данных применяют команду xchg.
xchg ax, bx
обменять содержимое регистров ax и bx
Для этой операции можно, конечно, применить последовательность из нескольких команд mov, но из-за того, что операция обмена используется довольно часто, разработчики системы команд микропроцессора посчитали нужным ввести отдельную команду обмена xchg.
mov dx, axmov ax, bxmov bx, dxКоманда XCHG
- !! Операнды должны иметь один тип
xchg ax, bl
- !! Не допускается (как и для всех команд ассемблера) обменивать между собой содержимое двух ячеек памяти
xchg Per1, Per2
Пример: поменять порядок следования байт в слове
ch1 dw 0f85ch [ch1]=5c, [chl+1]=f8... mov al,ch1 al = 5c xchg ch1+1,al al = f8, [chl+1]=5c mov ch1,al [ch1]=f8