Команды работы со стеком

Команды общего назначения

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

 

Команды пересылки данных осуществляют обмен данными и адресами между ячейками памяти и регистрами или портами ввода-вывода. Эти команды разделены на четыре группы: команды общего назначения, команды ввода-вывода, команды пересылки адресов и команды пересылки флагов.

 

 

Основная команда общего назначения 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.