Команды работы со стеком
Команды общего назначения
Команды пересылки данных
Команды пересылки данных осуществляют обмен данными и адресами между ячейками памяти и регистрами или портами ввода-вывода. Эти команды разделены на четыре группы: команды общего назначения, команды ввода-вывода, команды пересылки адресов и команды пересылки флагов.
Основная команда общего назначения MOV (MOVe – переслать) может переслать байт или слово между регистром и ячейкой памяти или между двумя регистрами. Она может также переслать непосредственно адресуемое значение в регистр или ячейку памяти.
Команда MOV имеет следующий формат:
MOV приемник,источник.
Примеры с использованием команды MOV рассматривались в главе 2.2.
Отметим лишь исключающие сочетания операндов в команде MOV:
1. Нельзя осуществлять пересылку данных из одной ячейки памяти в другую. Чтобы выполнить такую пересылку, данные источника надо загрузить в регистр общего назначения, а затем содержимое регистра в приемник. Например,
MOV AX,TAB1 ; пересылает данные из ячейки TAB1
MOV TAB2,AX ; в ячейку TAB2
2. Нельзя загрузить непосредственно адресуемый операнд в регистр сегмента. Например, инициализировать сегмент данных (DATAS):
MOV AX,DATAS
MOV DS,AX.
3. Нельзя непосредственно переслать значение одного регистра сегмента в другой. Пересылку нужно делать через регистр общего назначения.
5. Нельзя использовать регистр CS в качестве приемника.
Для временного сохранения данных (содержимого регистра или ячейки памяти) удобно использовать стек. Для работы со стеком есть две команды PUSH (поместить слово в стек) и POP (извлечь слово из стека).
Команда PUSH помещает содержимое регистра или ячейки памяти размером в слово на вершину стека. Команда POP, наоборот, снимает слово с вершины стека и помещает его в регистр или ячейку памяти.
Команды PUSH и POP имеют следующие форматы:
PUSH источник
POP приемник.
Будучи взаимно обратными командами, PUSH и POP обычно используются парами, т.е. каждой команде PUSH в программе должна соответствовать команда POP.
Вершина стека – это ячейка в сегменте стека, адрес которой содержится в указателе стека SP. Регистр SP всегда указывает на слово, помещенное в стек последним. Следовательно, команда PUSH вычитает 2 из значения указателя стека, а затем пересылает операнд-источник в стек.
4.3 Команды ввода-вывода
Команды ввода-вывода используются для взаимодействия с периферийными устройствами системы. Они имеют формат:
IN аккумулятор,порт
OUT порт,аккумулятор
Где аккумулятор – регистр AL при обмене байтами или регистр AX при обмене словами. Операндом порт может быть десятичное число от 0 до 255, что позволяет адресоваться к 256 устройствам.
В качестве операнда порт можно использовать регистр DX, что позволяет легко изменять номер порта, например, при необходимости пересылать одни и те же данные несколько различных портов.
IN AL,200 ;ввести байт из порта 200
IN AL,PORT_VAL ;или из порта указанного константой
OUT 30H,AX ; вывести слово в порт 30H
OUT DX,AX ; или в порт, указанный в DX.
5.4 Команды пересылки адреса
Команды пересылки адреса передает не содержимое переменных, а их адреса. Команда LEA (load effective address – загрузить эффективный адрес) пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначения, регистр указателя или индексный регистр. Она имеет формат:
LEA регистр16,память16
Где операнд память16 должен иметь атрибут WORD.
Операнд память16 в команде LEA может быть индексирован, что дает возможность осуществить гибкую адресацию. Например, если регистр DI содержит 2, то команда
LEA BX,TABLE[DI]
Загрузит смещение адреса TABLE+2 в регистр BX.
Команда LDS (load poINTer uSIng DS – загрузить указатель с использованием регистра DS) считывает из памяти 32-битовое двойное слово и загружает первые 16 битов в заданный регистр, а следующие 16 битов – в регистр сегмента данных DS. Она имеет формат:
LDS регистр16,память32,
Где регистр16 – любой 16-битовый регистр общего назначения, а память32 ячейка памяти с атрибутом типа DOUBLEWORD.
Команда LES (load poINTer uSIng ES – загрузить указатель с использованием регистра ES) идентична команде LDS, но загружает номер блока в регистр ES, а не в DS.