Команда MOV пересылает содержимое источника (второго операнда) на место приёмника (первого операнда) (табл. 5.10). Флаги команда не изменяет. Пересылаемая величина извлекается из команды, регистра или ячейки памяти, а записывается в регистр или ячейку памяти. Пересылать одной командой двойное слово запрещено.
Инструкции с кодами операций 8C и 8E обеспечивают загрузку и извлечение информации из сегментных регистров. Занесение информации в регистр CS запрещено, т.к. регистровая пара CS:IP определяет адрес команды, которая должна быть выполнена следующей. Поэтому для этой цели необходимо использовать любую инструкцию дальнего (межсегментного) перехода (см. раздел 5.5).
Табл. 10. Команда MOV.
Код
|
Инструкция
|
Описание
|
88 /r
|
MOV r/m8, r8
|
Пересылка из r8 в r/m8.
|
89 /r
|
MOV r/m16, r16
|
Пересылка из r16 в r/m16.
|
8A /r
|
MOV r8, r/m8
|
Пересылка из r/m8 в r8.
|
8B /r
|
MOV r16, r/m16
|
Пересылка из r/m16 в r16.
|
8C /r
|
MOV r/m16, Sreg
|
Пересылка из Sreg в r/m16.
|
8E /r
|
MOV Sreg, r/m16
|
Пересылка из r/m16 в Sreg.
|
A0 ow
|
MOV AL, m8
|
Пересылка из m8 в AL.
|
A1 ow
|
MOV AX, m16
|
Пересылка из m16 в AX.
|
A2 ow
|
MOV m8, AL
|
Пересылка из AL в m8.
|
A3 ow
|
MOV m16, AX
|
Пересылка из AX в m16.
|
B0+rb
|
MOV r8, imm8
|
Пересылка imm8 в r8.
|
B8+rw
|
MOV r16, imm16
|
Пересылка imm16 в r16.
|
C6 /0
|
MOV r/m8, imm8
|
Пересылка imm8 в r/m8.
|
C7 /0
|
MOV r/m16, imm16
|
Пересылка imm16 в r/m16.
|
Командой MOV запрещена также пересылка из одной ячейки памяти в другую, из одного сегментного регистра в другой и запись непосредственного операнда в сегментный регистр. Если по алгоритму такое действие требуется выполнить, оно реализуется путем пересылки данных через несегментный регистр.
Например, записать число 100 в сегментный регистр DS можно так:
MOV АХ, 100
MOV DS, AX
Как правило, в команде MOV легко определить тип одного из операндов и размер пересылаемой величины, например:
MOV АХ, 300 ; пересылка слова
MOV AH, AL ; пересылка байта
В ряде случаев по операндам команды MOV нельзя определить размер пересылаемой величины. Пусть в регистре AX находится адрес некоторой ячейки памяти и требуется записать 0 в эту ячейку. Такое обнуление можно сделать с помощью команды:
MOV [AX], 0
Однако по этой команде нельзя определить, какого размера пересылаемый ноль, поскольку второй операнд может обозначать ноль размером в байт (00h) или размером в слово (0000h). Кроме того, адрес из регистра AX может быть также адресом ячейки как размером в байт, так и размером в слово (с одного и того же адреса могут начинаться ячейки разных размеров). Поэтому ассемблер зафиксирует ошибку, сообщая, что типы операндов неизвестны.
Для явного указания типов операндов команды используется оператор указания типа PTR:
<тип> PTR <выражение>
где <тип> – BYTE, WORD или DWORD, выражение может быть константным или адресным.
Если указано константное выражение, то оператор сообщает, что значение выражения (число) должно рассматриваться как величина указанного типа (размера); например, BYTE PTR 0 – ноль как байт, а WORD PTR 0 – ноль как слово.
Если в PTR указано адресное выражение, то оператор сообщает, что адрес, являющийся значением выражения, должен восприниматься ассемблером как адрес ячейки указанного типа, например: WORD PTR A – адрес A обозначает слово (байты с адресами A и A+1).
Вернемся к нашему примеру и запишем его корректно с использованием оператора PTR. При обнулении байта по адресу из регистра AX, то команда имеет вид:
MOV BYTE PTR [AX], 0 или MOV [AX], BYTE PTR 0
Если требуется переслать нулевое слово:
MOV WORD PTR [AX], 0 или MOV [AX], WORD PTR 0
Обычно принято уточнять тип операнда-адреса, а не тип непосредственного операнда.
Перестановку двух величин можно реализовать с помощью команды MOV, однако существует и специальная команда XCHG (табл. 11). Инструкция меняет местами содержимое своих операндов. Флаги команда не меняет.
Табл. 11. Команда XCHG.
Do'stlaringiz bilan baham: |