Команды пересылки данных

Основная команда пересылки данных – команда MOV (от англ. MOVe – перенести). Формат команды показан на рис.7.1.

 

Рис. 7.1. Формат команды MOV

 

Данная команда копирует значение операнда-источника в операнд-приемник. На состояние флагов выполнение команды влияния не оказывает. Пример записи команды:

 

MOV AX,BX

MOV CX,field1

MOV DX,[BX]

 

Командой MOV нельзя пересылать данные из одной области памяти в другую. Для этого необходимо использовать промежуточный регистр общего назначения. Для записи значения в сегментный регистр также необходимо использовать промежуточный регистр общего назначения или стек. В команде MOV нельзя использовать сегментный регистр CS в качестве операнда назначения. Так как пара регистров СS:IP содержит физический адрес команды, которая должна выполняться следующей, то при модификации регистра CS фактически реализуется не пересылка, а переход на другую команду, что недопустимо.

Очень важно, чтобы операнды команды MOV совпадали по размеру. Однако при работе с памятью (при косвенной адресации) возникает сложность. Пусть в регистре BX содержится адрес некоторых данных, которые необходимо записать в регистр AX. Команда MOV в данном случае будет записываться как

 

MOV AX,[BX]

 

Однако в данном случае непонятно, что адресует регистр BX в памяти – байт, слово и т.д. Транслятор сам принимает решение по размеру большего операнда, но в некоторых случаях может быть получено предупреждающее сообщение о несовпадении типов операндов.

Для переопределения и согласования размеров операндов необходимо использовать оператор ptr. Формат оператора приведен на рис.7.2.

 

Рис. 7.2. Формат оператора ptr

 

Тип может принимать одно из следующих значений: byte, word, dword, qword, short (для переходов).

Правильно команду пересылки необходимо записывать следующим образом:

 

MOV AX, word ptr [BX] ;Если BX адресует слово в памяти

MOV byte ptr [BX],27 ;Если BX адресует байт в памяти

 

per1 DD 4AFE7BA1H

MOV AL,byte ptr per1+1 ;Пересылка старшего байта младшего слова из ;двойного слова (7BH)

 

В последнем примере реализовано обращение только к старшему байту младшего слова переменной. Если попытаться сделать это командой MOV AL,per1+1, то транслятор выведет сообщение о несовпадении типов операндов (ошибка).

Для обмена значениями двух операндов можно использовать несколько команд MOV, а можно использовать команду XCHG (от англ. eXCHanGe – обмен), формат которой приведен на рис.7.3.

 

Рис. 7.3. Формат команды XCHG

 

На состояние флагов выполнение команды влияния не оказывает. Операнды должны иметь один тип. Обменивать между собой содержимое двух ячеек памяти нельзя. Например:

 

XCHG AX,BX ;Обменять содержимое регистров AX и BX

XCHG DX, word ptr [SI] ;Обменять содержимое регистра AX

;и слова в памяти по смещению, хранящемуся в регистре SI