Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 30

Unknown Author

Если операнд находится в памяти, то в команде указывается адрес соответствующей ячейки. Такие операнды мы обозначаем буквой m (от memory, память) с указанием размера ячейки. В ЯА эти операнды задаются адресными выражениями.

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

В ПК достаточно много команд пересылки, здесь мы рассмотрим только две из них - MOV и XCHG. Кроме того, рассмотрим оператор PTR.

3.2.1. Команда MOV

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

Поэтому при программировании на ЯА можно считать, что имеется только одна команда пересылки. Ассемблер, проанализировав указанные в этой символьной команде операнды, сам выберет нужную машинную команду пересылки, которую и запишет в формируемую им машинную программу.

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

Примеры:

MOV АХ,500    ; А:»500

MOV BL,DH    ; BL:=DH

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

ор!

ор2

г8

i8, г8, ш8

пересылка байтов

т8

i8, г8

г16

il6, г16, sr, ш16

пересылка слов

sr (кроме CS)

г16, ш16

ш16

il6, г16, sr

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

MOV АХ,100

MOV DS,AX    ; DS:=100

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

Как известно, в ПК числа размером в слово хранятся в памяти в "перевернутом" виде, а в регистрах - в нормальном, неперевернутом. Команда MOV учитывает это и при пересылке слов между памятью и регистрами сама "переворачивает" их:

Q DW 1234h ; Q: 34h, Q+ls 12h MOV AX,Q ; AH=*12h, AL=34h

По команде MOV можно переслать как байт, так и слово. А как узнать, что именно - байт или слово - пересылает команда? Не может ли получиться так, что мы хотели написать команду пересылки слова, а оказалось, что команда пересылает байт? Ответ такой: размер пересылаемой величины определяется по типу операндов, указанных в символьной команде MOV. Более точно ситуация здесь следующая.