Содержание:
- Глава 1 - предисловие и материалы для скачивания
- Глава 2 - предварительные сведения перед изучением ассемблера
- Глава 3 - архитектура процессора 8086
- Глава 4 - сегментация, стэк, прерывания, адресация
- Глава 5 - ассемблер (директивы и операторы)
- Глава 6 - ассемблер (выражения, приоритеты и ссылки вперёд)
- Глава 7 - Загрузка и выполнение программ в DOS, структура EXE и COM программ
- Глава 8 - команды процессора: пересылка данных, стэк, ввод/вывод
- Глава 9 - арифметические команды процессора
- Глава 10 - команды операций сдвигов в Ассемблере
- Глава 11 - команды сравнения и передачи управления в Ассемблере
- Глава 12 - подпрограммы и прерывания в Ассемблере
- Глава 13 - строковые команды в Ассемблере
- Глава 14 - управление процессором
- Глава 15 - практика:EXE и COM программы, вывод на экран
- Глава 16 - практика: циклы и ввод с клавиатуры
- Глава 17 - практика: ввод чисел и системы счисления
- Глава 18 - практика: работа с файлами, перехват и восстановление прерываний
- Глава 19 - практика: дополнительные сведения
- Глава 20 - программирование для Windows
ВНИМАНИЕ! Данный самоучитель был написан много лет назад и его автор не сможет ответить на ваши вопросы. Курс по assembler предназначен для саморазвития. Если у вас хватает квалификации, можете предложить внести правки.
Строкой в Ассемблере называют последовательность байтов или слов длинной от 1 до 65535 байт. Операции со строками обеспечивают пересылку, сравнение, сканирование строк по значению, а также пересылку строки в аккумулятор или из него. Каждая строковая операция представленная в процессоре двумя командами: одна предназначена для обработки строк состоящих из байт, другая – из слов (их мнемоника различается наличием буквы B (byte) или W (word)).
Если флаг направления DF перед выполнением команды строковой обработки установлен в 0 (выполнена команда CLD), значение в индексном регистре автоматически увеличивается, если в 1 (выполнена STD) – уменьшается. Индексные регистры уменьшаются или увеличиваются на 1, если команды работают с байтами, или на 2 – если со словами.
Команды строковой обработки чаще всего используются с однобайтными префиксами (префиксами повторения), которые обеспечивают многократное автоматическое повторение выполнения команды.
Команда сравнения строк CMPS (CMPSB, CMPSW).
Команда CMPS сравнивает значение элемента одной строки (DS:SI) со значением элемента второй строки (ES:DI) и настраивает значения регистров на следующие элементы строк в соответствии с флагом направления DF. Сравнение происходит как и по команде сравнения CMP. Результат – сформированные флаги.
Команда сканирования строки SCAS (SCASB, SCASW).
Команда SCAS производит сравнение содержимого регистра (AL или AX) с байтом памяти, абсолютный адрес которого определяется парой ES:DI, после чего регистр DI устанавливается на соседний элемент памяти (байт или слово) в соответствии с флагом DF. Команда SCAS используется обычно для поиска в строке (ES:DI) элемента заданного в регистре AL или AX.
Команда пересылки строки MOVS (MOVSB, MOVSW).
Команда MOVS пересылает поэлементно строку DS:SI в строку ES:DI и настраивает значения индексных регистров на следующий элемент строки.
Команда сохранения строки STOS (STOSB, STOSW).
Команда STOS заполняет строку, содержащуюся по адресу ES:DI, элементом из регистра AL или AX. На флаги команда не влияет
Команда загрузки строки LODS (LODSB, LODSW).
Команда LODS записывает в регистр AL или AX содержимое ячейки памяти, адрес которой задается регистрами DS:SI. Флаги не меняются.
Префиксы повторения.
В системе команд процессора имеется две команды без операндов, которые называются префиксами повторения:
1-ый префикс: REPE (повторять, пока равно)
REPZ (повторять, пока ноль)
REP (повторять)
2-ой префикс: REPNE (повторять, пока не равно)
REPNZ (повторять, пока не ноль)
Префиксы повторения ставятся перед строковыми командами обязательно в той же строке, например: REPE CMPB
Префикс использует регистр CX как счетчик циклов. На каждом этапе цикла выполняются следующие действия:
- Проверка CX. Если он равен 0 – выход из цикла и переход к следующей команде.
- Подтверждение любых возникающих прерываний.
- Выполнение указанной строковой операции.
- Уменьшение CX на единицу, флаги при этом не изменяются.
- Проверка флага ZF, если выполняется строковая операция SCAS или CMPS. Если условие повторения цикла не выполняется – выход из цикла и переход к следующей команде. Выход из цикла, если префиксом является REPE и ZF=0 (последнее сравнение не совпало) или используется префикс REPNE и ZF=1 (последнее сравнение не совпало).
- Изменение значения индексных регистров в соответствии со значением флага направления и переход на начало цикла.
Фрагмент программы, иллюстрирующий работу со строковыми данными, приведен ниже.
CLD ;DF=0
LEA SI,s1 ;DS:SI=начало s1
LEA DI,s2 ;ES:DI=начало s2
MOV CX,n ;CX=длинна строк
REPE CMPSB ;сравнение, пока элементы равны
JNE NoEq ;если s1<>s2 (ZF=0), то на NoEq
...
NoEq:
...