- •Программирование на языке Ассемблер
- •Классификация языков программирования
- •Поколения мп
- •Структура мп 8086
- •Регистры мп
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры смещений
- •Регистр флагов
- •Структура и организация памяти
- •Сегментация памяти и формирование адреса
- •Особенности машинных команд
- •Основные команды мп
- •1.2 Перестановка (exchange):
- •1.3 Загрузка исполнительного адреса (load effective address):
- •3.1 Команды умножения
- •3.2 Команды деления
- •Переходы. Циклы
- •Команды сравнения и условного перехода
- •Команды условного перехода
- •3. Команды управления циклом
- •Язык Ассемблера ibm pc. Структура операторов и директив. Метки, переменные и их атрибуты
- •Команды
- •Директивы
- •Директивы определения данных
- •Конструкция повторения dup
- •Директива dd (define double word, определить двойное слово)
- •Директивы эквивалентности и присваивания
- •Структура программы. Логические сегменты
- •Побитовая обработка и ее основные виды
- •2. Команды сдвига
- •2.1. Логические сдвиги
- •2.2. Арифметические сдвиги
- •2.3. Циклические сдвиги
- •Стек и сегмент стека
- •Стековые команды
- •Пример использования стека
- •Модульное программирование
- •Типы объединения модулей
- •Связь Паскаль-Ассемблер
- •Параметры-значения
- •Параметры-переменные
- •Способы адресации
- •Команды строковых примитивов
- •Сканирование строки: scasb, scasw
- •Приемы обработки структурированной информации
- •Inc si ; к следующей оценке
- •Inc dx ; учет отличника
- •Составление и оформление программ на ассемблере
- •Префикс программного сегмента. Com- и exe-программы
- •Команда прерывания
- •Функции прерывания 21h
- •Процесс разработки программы на языке ассемблера
- •Трансляция программы
- •Компоновка программы
- •Макроповторения
- •Макрооператоры
- •Директива local
- •Директивы условного ассемблирования
- •Директивы if и ife
- •Директивы ifidn и ifdif
Способы адресации
Адресация – это задание адреса хранения операнда.
Существуют следующие способы адресации.
Регистровая адресация:
mov ax, bx
push ds
Непосредственная адресация:
mov ax, 2
Прямая адресация:
mov ax, х
Косвенная адресация:
mov ax, [bх]
Базовая, адресация по базе со сдвигом:
mov ax, [bх+2]
mov di, [bp+4]
Индексная адресация:
mov ax, mas[si]
Базово-индексная адресация:
mov ax, [bx+si+2]
Команды строковых примитивов
Команда |
Описание |
Операнды |
MOVS |
Перемещает строки данных: копирует байт или слово из одного участка памяти в другой |
MOVS [DI], [SI] |
CMPS |
Сравнивает строки: сравнивает в памяти байты или слова |
CMPS [SI], [DI] |
SCAS |
Сканирует строки: сравнивает регистры AL или AX с содержимым памяти, изменяя регистр флагов |
SCAS [DI], AL SCAS [DI], AX |
STOS |
Сохраняет строку данных: сохраняет содержимое регистров AL или AX в памяти |
STOS [DI], AL STOS [DI], AX |
LODS |
Загружает аккумулятор из строки: загружает байт или слово в AL или AX из памяти |
LODS AL, [SI] LODS AX, [SI]
|
Операнд-отправитель размещается по адресу, указанному в регистрах DS:SI. Адрес операнда-получателя указан в регистрах ES:DI. В регистрах DS и ES необходимо указать начало сегмента данных до того, как будут использоваться команды работы со строками.
Пример:
MOV AX, DATA ; установить адрес сегмента данных
MOV DS, AX ; инициализировать DS
MOV ES, AX ; инициализировать ES
Команда |
Размер |
Описание |
Шаг инкрементации для SI и DI |
MOVS |
MOVSB |
Перемещает (копирует) байт |
1 |
|
MOVSW |
Перемещает (копирует) слово |
2 |
CMPS |
CMPSB |
Сравнивает байты |
1 |
|
CMPSW |
Сравнивает слова |
2 |
SCAS |
SCASB |
Сканирует байт |
1 |
|
SCASW |
Сканирует слово |
2 |
STOS |
STOSB |
Сохраняет байт |
1 |
|
STOSW |
Сохраняет слово |
2 |
LODS |
LODSB |
Загружает байт |
1 |
LODSW |
Загружает слово |
2 |
В регистрах SI и DI должны быть установлены смещения операндов.
Пример:
MOV SI, offset source ; SI указывает на отправителя
MOV DI, offset dest ; DI указывает на получателя
MOVSB ; копирует отправитель в получатель
(Оператор OFFSET возвращает смещение метки или переменной от начала сегмента).
Использование префикса повторения
REP ; повторять, пока СХ>0
REPZ, REPE ; повторять, пока флаг нуля установлен и СХ>0
REPNZ, REPNE ; повторять, пока флаг нуля сброшен и СХ>0
ПП заставляет многократно повторяться следующую за ним строковую команду. При этом данная пара команд выполняется значительно быстрее, чем организованный цикл.
Число повторений должно быть записано в регистр CX до выполнения этой пары команд.
Для выхода из цикла в этом случае есть две причины: либо строки просмотрены полностью и все их элементы оказались равными (CX=0 и ZF=1), либо нашлась пара неравных элементов (ZF=0, CX - любое). По какой причине произошел выход, надо устанавливать после выхода из цикла.
Флаг направления DF
Значение флага |
Действие на SI или DI |
Направление |
0 |
Инкрементируется |
Снизу вверх |
1 |
Декрементируется |
Сверху вниз |
Значение флага направления задает автор программы.
Флаг направления изменяется командами CLD и STD.
CLD ; сбросить флаг направления, направление – вверх
STD ; установить флаг направления, направление вниз
Команда MOVS (Пересылка строки)
Команда MOVSB пересылает байт, а команда MOVSW – слово, абсолютный адрес которого задается парой регистров DS:SI, в ячейку, абсолютный адрес которой задается парой ES:DI, после чего значения регистров SI и DI автоматически меняются.
[DS:SI]=>[ES:DI] ; SI:=SI+d; DI:=DI+d, где величина d определяется согласно состоянию флага DF (флаг направления).
Выход из цикла пересылки всей строки из одного места памяти в другое возможен тогда, когда будут переписаны все элементы строки. Для этого перед командой MOVS указывается префикс с названием REP.
REP MOVSB ; повторять пересылку байтов CX раз
Пример: содержимое массива Y переписать в массив X
CLD
LEA SI, Y ; ОТКУДА
PUSH DS
POP ES ; УСТАНОВКА ES НА СЕГМЕНТ ДАНЫХ
LEA DI, X ; КУДА
MOV CX, 100 ; СКОЛЬКО БАЙТ ПЕРЕПИСАТЬ
REP MOVSB
Команды сравнения строк
CMPSB – сравнение строк из байтов
CMPSW – сравнение строк из слов
[DS:SI]=[ES:DI] ? ; SI:=SI+d; DI:=DI+d
Команды сравнивают пару элементов – элемент из одной строки с элементом из другой строки. Абсолютный адрес элемента из первой строки должен задаваться регистрами DS и SI, а абсолютный адрес элемента из второй строки – регистрами ES и DI.
После выполнения данных команд меняются значения регистров SI и DI. В них записываются адреса соседних элементов строк. При DF=0 значения регистров увеличиваются, то есть происходит переход вперед. При DF=1 значения регистров уменьшаются, происходит переход назад.
Пример:
Пусть строка S1 из N байтов расположена в сегменте памяти, на начало которого установлен сегментный регистр DS, а строка S2 из того же числа байтов находится в сегменте, на начало которого установлен регистр ES. Проверить равенство строк.
Просмотр вперед для проверки равенства строк:
CLD ; DF=0
LEA SI, S1 ; DS:SI=начало S1
LEA DI, S2 ; ES:DI=начало S2
MOV CX, N ; длина строк
L: CMPSB ; сравнить пару элементов
JNE NOEQ ; S1<> S2 переход на NOEQ
LOOP L ; к следующей паре
EQ: … ; S1= S2
CLD ; DF=0
LEA SI, S1 ; DS:SI=начало S1
LEA DI, S2 ; ES:DI=начало S2
MOV CX, N ; длина строк
REPE CMPSB ; сравнить пока элементы равны (пока ZF=1)
JE EQ ; ZF=1 (S1=S2) переход на EQ
NOEQ: … ; ZF=0 (S1<> S2)
REPNE CMPSB
ПП заставляет повторять сравнение элементов строк, пока они не равны. Как только будет найдена пара равных элементов, цикл прекращается.