Assembler для начинающих

Предназначение сегментов


    Каждый из  сегментных регистров имеет свое,  отмеченное выше назна-
    чение. В  некоторых случаях, однако,  более удобна связь  с данными
    вне  сегмента  данных,  например,  с  небольшой  областью  данных в
    программе. В большинстве случаев программа работает с данными в той
    области,  на  которую  указывает  регистр  DS,  но иногда программе
    требуется  ссылка на  локальную переменную,  находящуюся в    кодовом
    сегменте  программы.  Чтобы   осуществить  эту  ссылку,  приходится
    изменять обычное использование  сегментов. Фиг.3.8 показывает такую
    органзацию программы.
 
                ГДДДДДДДДДДДДДДДДДДДЕДДДДДД CS
                і Программа и і


                і             і
                і  локальные данные і
                і             ГДДДДДД CS:LOCAL_VALUE
                ГДДДДДДДДДДДДДДДДДДДґ
                і             і
                і             і
                і             і
                ЕДДДДДДДДДДДДДДДДДДДЕДДДДДД DS
                і Основная   і
                і             і
                і область даных     і
                і             і
                ГДДДДДДДДДДДДДДДДДДДґ
                і             і
 
       Фиг. 3.8 Переназначение CS на локальные данные.
 
      Вместо      изменения значения  регистра DS,  чтобы он  указывал на
    программный сегмент, команда изменяет  ссылку на данные, показывая,
    что переменная расположена в сегменте кодов (Code Segment).
 
      INC   CS:LOCAL_VARIABLE
 
    Это  делается с  помощью префикса  "CS:". В  машинном языке команда
    переопределения  сегмента выглядит    как однобайтовый  префикс перед
    обычной командой машинного языыка. 8088 понимает этот префикс пере-
    назначения    сегмента и  изменяет обычный  способ вычисления адреса.
    Вместо регистра DS процессор  использует для вычисления физического
    адреса  данных  регистр  CS.   Одного  префикса  в      команде  всегда
    достаточно, так  как 8088 может адресоваться  в ней не более  чем к
    одной ячейке памяти.
      Для нормального  обращения к данным  команда может использовать
    любой из  четырех сегментных регистров. Регистр  DS используется по
    умолчанию,    то есть  когда в  команде не  указан другой  сегментный
    регистр,  то  используется      DS.  Помните,  что  при использовании в
    адресных вычислениях регистра BP  сегментом по умолчанию становится
    стековый сегмент.  Команда может определить и  любой из трех других
    сегментных    регистров, указав  его в  адресном выражении. Некоторые
    команды, правда,  не могут пользоваться  переназначением сегментов.
    Это - команды   обработки строк.      Строковая  команда  определяет
    использование  регистров  неявным  образом,  и  оно  не  может быть
    изменено. В главе 4 мы обсудим строковые команды и их специфическое
    пользование сегментами.




Содержание раздела