Команды пересылки данных осуществляют обмен данными между регистрами процессора и ячейками адресного пространства памяти или адресного пространства ввода—вывода.
Основная команда общего назначения MOV (переслать) может переслать байт или слово между регистрами и ячейкой памяти или между двумя регистрами (рис. 2.11). В команде допустимо следующее сочетание операндов:
MOV REG8, R8/M8 MOV R8/M7, REG8 MOV R16/Ml6, SR MOV AL, M8 MOV M8, AL MOV REGS, DATA8 MOV M8, DATA8 |
MOV REG16, R16/M16 MOV R16/M16, REG 16 MOV SR, R16/M16 MOV AX, M16 MOV Ml6, AX MOV REG16, DATA 16 MOV M16, DATA 16 |
В команде MOV исключаются следующие сочетания операндов:
1) нельзя осуществить непосредственную пересылку данных из одной адресуемой ячейки памяти в другую;
2) нельзя загрузить непосредственно адресуемый операнд в сегментный регистр;
3) нельзя непосредственно переслать содержимое одного сегментного регистра в другой;
4) нельзя использовать регистр CS в качестве приемника в команде пересылки (для этого служат команды межсегментных переходов).
Адрес Содержимое Команда Комментарий
CS:OlOO A1 59 02 MOV AX, [259h] ;Пересылка из DS:259h в АХ
CS:0103 A3 59 02 MOV. [259h], AX ;Пересылка из АХ в DS:259h
CS:O106 26 89 07 MOV ES:[BX], AX ; Пересылка из АХ в ES:[BX]
CS:0109 8E D8 MOV DS, AX ;Пересылка из АХ в DS
CS:010B 88 C3 MOV BL, AL ;Пересылка из AL в BL
CS:010D Bl El MOV CL, -30 ;3асылка константы -30 в CL
CS:010F C6 06 03 00 19 MOV [3], 25 ;3асылка константы 25 в [3]
Рис. 2.11. Примеры кодирования и использования команды MOV
Имеются две команды для работы со стеком — PUSH (поместить слово в стек) и POP (извлечь слово из стека). Команда PUSH помещает содержимое регистра или адресуемой ячейки памяти размером в слово в стек, а команда POP, наоборот, извлекает последнее занесенное слово из стека и помещает его в адресуемую ячейку памяти или регистр.
Команды PUSH и POP используются парами, т.е. каждой команде PUSH в программе должна соответствовать своя команда POP. Под вершиной стека мы понимаем ячейку памяти в сегменте стека, эффективный адрес которой содержится в указателе стека SP. Так как стек “растет” по направлению к младшим адресам памяти, то первое помещаемое в стек слово запоминается в ячейке стека с наибольшим адресом, следующее . ~ по адресу на два меньше и т.д. Регистр SP всегда указывает на слово, помещенное в стек последним. Следовательно, команда PUSH вычитает 2 из значения указателя стека, а затем пересылает операнд—источник в стек, по адресу SS:SP. Действуя обратным образом, команда POP пересылает в операнд—приемник слово, адрес которого равен SS:SP, а затем добавляет 2 к содержимому регистра указателя стека SP. На рис. 2.12 показаны состояния стека и его указателя SP до и после использования команд PUSH и POP.
В стековых командах POP и PUSH допустимо использование следующих операндов (рис. 2.13)
Команда обмена XCHG (exchange — обменять) меняет между собой содержимое двух регистров или содержимое регистра и ячейки памяти. Однако она не может выполнить обмен значений сегментных регистров. В команде XCHG допустимо использование следующих операндов (см. рис. 2.14):
Команды загрузки адреса передают не- содержимое переменных, а их эффективные адреса. Команда загрузки исполнительного адреса LEA (load effectiv address — загрузить эффективный адрес) пересылает смещение ячейки памяти, определяемое указанным в команде способом адресации в любой 16-битовый регистр общего назначения, регистр указателя или индексный регистр. В команде LEA допустимо использование только следующих операндов (см. рис. 2.15):
LEA REG16, М16
Команда LES (LDS) (load pointer using ES (DS) — загрузить 32-битовый адрес (указатель) с использованием регистра ES (DS) считывает из адресуемой ячейки памяти два слова и загружает первое слово в 16-битовый регистр, задаваемый в команде, а второе — в сегментный регистр ES (DS). Полный . адрес ячейки памяти состоит из двух слов, в первом из которых (по меньшему адресу) хранится смещение в сегменте, а во втором (с большим адресом) — адрес сегмента. В команде LDS и LES допустимо использование только следующих операндов (см. рис. 2.16):
Команды перемещения флагов в стек PUSHF и извлечение флагов из стека POPF пересылают содержимое регистра флагов в стек и обратно. Они идентичны командам PUSH и POP, но в них не требуется указывать операнд, так как под ним подразумевается регистр флагов (неявное задание, операндов). Каждой команде PUSHF должна соответствовать исполняемая позже команда POP. В командах PUSHF, POPF операнды не задаются (рис. 2.17).