- •2.4. Машинный язык и язык Ассемблера
- •2.5. Синаксис языка Ассемблера
- •2.6. Принципы работы Ассемблера
- •2.7. Биты, байты и слова
- •2.8. Нумерация бит
- •2.9. Набор символов
- •2.10. Принципы работы компьютера
- •2.11. Процедуры
- •2.12. Стек
- •2.13. Прерывания
- •3.1. Модель программирования 8088
- •3.2. Регистры общего назначения
- •3.3. Регистры адресации
- •3.4. Прямая адресация
- •3.5. Вычисление адресов
- •3.6. Адресация через базу и смещение
- •3.8. Байт mod r-m
- •3.9 Физическая адресация
- •3.10. Сегментные регистры
- •3.11. Предназначение сегментов
- •3.12. Оператор Segment
- •3.13. Оператор Assume
- •3.14. Управляющие рагистры
- •3.14.1. Указатель инструкций (ip)
- •3.14.2. Указатель стека
- •3.14.3. Регистр флагов
- •3.14.4. Флаг знака
- •3.14.5. Флаг нуля
- •3.14.6. Флаг четности
- •3.14.7. Флаг переноса
- •3.14.8. Дополнительный флаг переноса
- •3.14.9. Флаг переполнения
- •3.14.10. Флаг захвата
- •3.15. Векторы прерываний
- •Глава 4 - Набор команд микропроцессора 8088
- •4.1. Пересылка данных
- •4.1.1. Команда пересылки
- •4.1.2. Команда замены
- •4.1.3. Команды ввода и вывода
- •4.1.4. Загрузка исполнительного адреса
- •4.1.5. Загрузка указателя
- •4.1.6. Пересылка флагов
- •4.1.7. Перекодировка
- •4.2. Операции со стеком
- •4.3. Передача параметров
3.10. Сегментные регистры
INTEL 8088 имеет четыре сегментных регистра: CS,DS,SS и ES - для кодового, данных-, стекового и дополнительного сегментов соответственно. Это их обычное использование, но применение этих регистров может именяться в соответствии с потребностями программы.
8088 использует регистр сегмента программы для идентификации того сегмента, который содержит выполняемую вданный момент программу. В сочетании с указателем команд регистр CS используется для указания текущей команды. Каждая выполняемая команда находится в ячейке, на которую указывает пара регистров CS:IP. Комбинация сегментного регистра с регистром смещения для указания физического адреса записывается в виде сегмент:смещение, например, CS:IP. Значение сегмента стоит перед двоеточием, смещение - после. Такая нотация используется и для регистров, и для абсолютных адресов. Вы можете писать такие адреса как CS:100, DS:BX, 570:100, или 630:DI.
Регистр сегмента данных (DS) процессор использует для обычного >доступа к данным. Схемы адресации для операндов, которые мы рассматривали впредыдущем пункте, дают 16-битовое смещение, и в большинстве случаев для формирования исполнительного адреса процессор комбинирует это смещение с ргеистром DS.
Регистр сегмента стека указывает на системный стек. Команды PUSH, POP, CALL и RET управляют данными в стеке в позиции по адресу SS:SP. Регистр SP - указатель стека - служит для определения смещения в стеке. Кроме того, сегмент стека подразумевается по умолчанию при адресации с использованиемрегистра BP. Это дает доступ к данным в стеке с использованием в качестве указателя регистра BP. В следующей главе есть пункт о стековых операциях, который демонстрирует, каким образом адресация через BP упрощает связь с данными в стеке.
Наконец, регистр дополнительного сегмента используется 8088 для доступа к данным, когда требуется более одного сенмента. Обычной операцией такого рода является копирование данных из одной области памяти в другую. Между областями, находящимися не внутри одного и того же блока памяти размером 64К, невозможно произвести обмен данными, используя единственный сегментный регистр. Имея в распоряжении дополнительный сегментный регистр, программа, как показано на Фиг. 3.7, может указать одновременно исходный и целевой сегменты. Регистр DS указывает область исходных данных, а регистр ES - сегмент назначения.
Копировать отсюда DS:источник ==> сюда ES:приемник
Фиг.3.7 Копирование из сегмента в сегмент
Для передачи данных существуют специальные строковые команды, которые автоматически используют регистры DS и ES для указания исходного и целевого регистров.
3.11. Предназначение сегментов
Каждый из сегментных регистров имеет свое, отмеченное выше назначение. В некоторых случаях, однако, более удобна связь с данными вне сегмента данных, например, с небольшой областью данных в программе. В большинстве случаев программа работает с данными в той области, на которую указывает регистр DS, но иногда программе требуется ссылка на локальную переменную, находящуюся в кодовом сегменте программы. Чтобы осуществитьэту ссылку, приходится изменять обычное использование сегментов. Фиг.3.8 показывает такую органзацию программы.
Сегмент |
Программа и локальные данные |
CS |
CS:LOCAL_VALUE |
DS |
DS:Основная область даных |
Фиг. 3.8 Переназначение CS на локальные данные.
Вместо изменения значения регистра DS, чтобы он указывал на программный сегмент, команда изменяет ссылку на данные, показывая, что переменная расположена в сегменте кодов (Code Segment).
< CS:LOCAL_VARIABLE INC>
Это делается с помощью префикса "CS:". В машинном языке команда переопределения сегмента выглядит как однобайтовый префикс перед обычной командой машинного языка. 8088 понимает этот префикс переназначения сегмента и изменяет обычный способ вычисления адреса. Вместо регистра DS процессор использует для вычисления физического адреса данных регистр CS. Одного префикса в команде всегда достаточно, таккак 8088 может адресоваться в ней не более чем к одной ячейке памяти. Для нормального обращения к данным команда может использовать любой из четырех сегментных регистров. Регистр DS используется по умолчанию, то есть когда в команде не указан другой сегментный регистр, то используется DS. Помните, что при использовании в адресных вычислениях регистра BP сегментом по умолчанию становится стековый сегмент. Команда может определить и любой из трех других сегментных регистров, указав его в адресном выражении. Некоторые команды, правда,не могут пользоваться переназначением сегментов. Это - команды обработки строк. Строковая команда определяет использование регистров неявным образом, и оно не может быть изменено. В главе 4 мы обсудим строковые команды и их специфическое пользование сегментами.