Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер.doc
Скачиваний:
24
Добавлен:
25.08.2019
Размер:
526.34 Кб
Скачать

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 мы обсудим строковые команды и их специфическое пользование сегментами.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]