Справочник по языку Ассемблера IBM PC

       

Команды пересылки данных общего назначения


К этой группе относятся следующие команды:


mov <операнд назначения>,<операнд-источник>


xchg <операнд1>,<операнд2>


- это основная команда пересылки данных. Она реализует самые разнообразные варианты пересылки.


Отметим особенности применения этой команды:

командой mov нельзя осуществить пересылку из одной области памяти в другую. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.


К примеру, рассмотрим фрагмент программы для пересылки байта из ячейки fls в ячейку fld:



masm model   small .data fls     db      5 fld     db      ? .code start: ...         mov     al,fls         mov     fld,al         ... end     start

нельзя загрузить в сегментный регистр значение непосредственно из памяти. Поэтому для выполнения такой загрузки нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек. Если вы посмотрите листинги 3.1 и 5.1, то увидите в начале сегмента кода две команды mov, выполняющие настройку сегментного регистра ds. При этом из-за невозможности загрузить впрямую в сегментный регистр значение адреса сегмента, содержащееся в предопределенной переменной @data, приходится использовать регистр общего назначения ax;

нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных все те же регистры общего назначения. Вот пример инициализации регистра es значением из регистра ds:

          mov     ax,ds         mov     es,ax


К этой группе относятся следующие команды:


mov <операнд назначения>,<операнд-источник>


xchg <операнд1>,<операнд2>


- это основная команда пересылки данных. Она реализует самые разнообразные варианты пересылки.


Отметим особенности применения этой команды:

командой mov нельзя осуществить пересылку из одной области памяти в другую. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.


К примеру, рассмотрим фрагмент программы для пересылки байта из ячейки fls в ячейку fld:

masm model   small .data fls     db      5 fld     db      ? .code start: ...         mov     al,fls         mov     fld,al         ... end     start

нельзя загрузить в сегментный регистр значение непосредственно из памяти. Поэтому для выполнения такой загрузки нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек. Если вы посмотрите листинги 3.1 и 5.1, то увидите в начале сегмента кода две команды mov, выполняющие настройку сегментного регистра ds. При этом из-за невозможности загрузить впрямую в сегментный регистр значение адреса сегмента, содержащееся в предопределенной переменной @data, приходится использовать регистр общего назначения ax;

нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных все те же регистры общего назначения. Вот пример инициализации регистра es значением из регистра ds:

          mov     ax,ds         mov     es,ax

<


Но есть и другой, более красивый способ выполнения данной операции — использование стека и команд push и pop:

          push    ds      ;поместить значение регистра ds в стек         pop     es      ;записать в es число из стека

нельзя использовать сегментный регистр cs в качестве операнда назначения. Причина здесь простая. Дело в том, что в архитектуре микропроцессора пара cs:ip всегда содержит адрес команды, которая должна выполняться следующей. Изменение командой mov содержимого регистра cs фактически означало бы операцию перехода, а не пересылки, что недопустимо.

Для двунаправленной пересылки данных применяют команду . Для этой операции можно, конечно, применить последовательность из нескольких команд mov, но из-за того, что операция обмена используется довольно часто, разработчики системы команд микропроцессора посчитали нужным ввести отдельную команду обмена xchg. Естественно, что операнды должны иметь один тип. Не допускается (как и для всех команд ассемблера) обменивать между собой содержимое двух ячеек памяти. К примеру,

          xchg    ax,bx   ;обменять содержимое регистров ax и bx         xchg    ax,word ptr [si]        ;обменять содержимое регистра ax                 ;и слова в памяти по адресу в [si]



Но есть и другой, более красивый способ выполнения данной операции — использование стека и команд push и pop:

          push    ds      ;поместить значение регистра ds в стек         pop     es      ;записать в es число из стека

нельзя использовать сегментный регистр cs в качестве операнда назначения. Причина здесь простая. Дело в том, что в архитектуре микропроцессора пара cs:ip всегда содержит адрес команды, которая должна выполняться следующей. Изменение командой mov содержимого регистра cs фактически означало бы операцию перехода, а не пересылки, что недопустимо.

Для двунаправленной пересылки данных применяют команду . Для этой операции можно, конечно, применить последовательность из нескольких команд mov, но из-за того, что операция обмена используется довольно часто, разработчики системы команд микропроцессора посчитали нужным ввести отдельную команду обмена xchg. Естественно, что операнды должны иметь один тип. Не допускается (как и для всех команд ассемблера) обменивать между собой содержимое двух ячеек памяти. К примеру,

          xchg    ax,bx   ;обменять содержимое регистров ax и bx         xchg    ax,word ptr [si]        ;обменять содержимое регистра ax                 ;и слова в памяти по адресу в [si]


Содержание раздела