Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
qyaLMmrXCn.file.doc
Скачиваний:
1
Добавлен:
30.04.2022
Размер:
262.66 Кб
Скачать

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

Команда MOV

В ПК есть машинные команды пересылки байта или слова (переслать одной командой двойное слово нельзя). Пересылаемая величина берется из команды регистра или ячейки памяти, а записывается в регистр или ячейку памяти (записывать в команду, естественно, нельзя). Команда пересылки MOV записывается следующим образом:

MOV op1, op2

По команде MOV на место первого операнда пересылается значение второго операнда: opl:=op2. Примеры:

MOV AX, 500 ; AX:=500

MOV BL, DH ; BL:=DH

В команде MOV допустимы следующие комбинации операндов (табл. 3).

Таблица 3

Допустимые комбинации операндов команды MOV

Операнд 1

Операнд 2

Регистр 8 бит

– Регистр 8 бит

– Константа или непосредственный операнд 8 бит

– Переменная или адрес памяти 8 бит

Переменная или адрес памяти 8 бит

– Регистр 8 бит

– Константа или непосредственный операнд 8 бит

Регистр 16 бит

– Регистр 16 бит

– Константа или непосредственный операнд 16 бит

– Переменная или адрес памяти 16 бит

– Сегментный регистр

Сегментный регистр (кроме CS)

– Регистр 16 бит

– Переменная или адрес памяти 16 бит

Переменная или адрес памяти 16 бит

– Регистр 16 бит

– Константа или непосредственный операнд 16 бит

– Сегментный регистр

Из данной таблицы видно, что запрещены пересылки из одной ячейки памяти в другую, из одного сегментного регистра в другой, запись непосредственного операнда в сегментный регистр. Это обусловлено тем, что в ПК нет таких машинных команд. Если по алгоритму все же нужно такое действие, то оно реализуется в две команды, пересылкой через какой-нибудь несегментный регистр. Например, записать число 100 в сегментный регистр DS можно так:

MOV АХ, 100

MOV DS, AX ; DS:=100

Отметим также, что командой MOV нельзя менять содержимое сегментного регистра CS. Эго связано с тем, что регистры CS и IP определяют адрес той команды программы, которая должна быть выполнена следующей, поэтому изменение любого из этих регистров есть не что иное, как операция перехода, а не пересылка. Команда же MOV не реализует переход.

Обычно команда MOV сама распознает размер пересылаемой величины по типу одного из операндов. В противном случае тип одного из операндов надо указать явным образом.

Команда PTR

В команде MOV размеры обоих операндов должны совпадать (либо оба операнда должны быть размером байт, либо оба операнда должны быть размером слово). Если тип операндов явно не указан, может возникнуть ошибка (при компиляции программы появится сообщение о неизвестных типах операндов).

Для явно указания типа используется оператор PTR (от pointer – указатель), который записывается следующим образом:

<тип> PTR <выражение>

где <тип> – это BYTE, WORD или DWORD (возможны другие варианты), а выражение может быть константным или адресным.

Если указано константное выражение, то оператор указывает, что значение этого выражения (число) должно рассматриваться ассемблером как величина указанного типа (размера); например, BYTE PTR 0 - это ноль как байт, а WORD PTR 0 - это ноль как слово. Отметим, что в этом случае оператор PTR относится к константным выражениям.

Если же в PTR указано адресное выражение, то оператор указывает, что адрес, являющийся значением выражения, должен восприниматься ассемблером как ад­рес ячейки указанного типа (размера); например: WORD PTR А - адрес А обозначает слово (байты с адресами А и А+1). В данном случае оператор PTR относится к адресным выражениям.

Пример. Если требуется обнуление байта по адресу из регистра SI, то для этого надо использовать команду

MOV [SI], BYTE PTR 0

а если надо переслать нулевое слово, то команду

MOV [SI], WORD PTR 0

Оператор PTR полезен еще в одной ситуации - когда надо не уточнить тип операнда, а изменить его. Пусть, к примеру, Z - переменная размером в слово:

Z DW 1234h ;первый байт Z: 34h, второй байт Z+l: 12h

и надо записать ноль не во все это слово, а только в его первый байт - в тот, где находится величина 34h. Командой

MOV Z, 0

этого сделать нельзя, так как 0 запишется в оба байта. Но с помощью оператора PTR можно сделать так, чтобы Z рассматривалось как имя байта.

MOV BYTE PTR Z, 0 ;первый байт Z: 00h, второй байт Z+l: 12h

Если требуется записать какое-либо значение во второй байт переменной Z, то можно использовать команду PTR следующим образом:

MOV BYTE PTR (Z+1), 15

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]