Курс лекций по программированию на языке ассемблера. Макурина Т.А. - 14 стр.

UptoLike

Составители: 

14
Лекция 5
Псевдооператоры
Псевдооператор определения сегмента
Для работы с данными необходимо уметь определять сегменты и данные в них.
Пример определения сегмента данных:
DATASEG SEGMENT PARA PUBLIC DATA
A DB ?
B DB 10,20,30,40
C DW
DATASEG ENDS
где DATASEG – имя сегмента данных или адрес начала сегмента данных
SEGMENT – псевдооператор определения сегмента
Формат псеводооператора следующий
имя_сег SEGMENT [тип подгонки] [тип_связи] [‘класс’] [ тип размера памяти]
…..
имя_сег ENDS
[тип подгонки]сообщает компоновщику о том, что нужно обеспечить размещение начала
сегмента на заданной границе. Это важно, т.к. при правильном выравнивании доступ к данным в
процессорах i80x86 выполняется быстрее. Допустимы следующие значения:
BYTE – выравнивание не выполняется. Сегмент может начинаться с любого адреса памяти.
WORD – сегмент начинается по адресу, кратному двум, т.е. последний (младший)
значащий бит физического адреса равен 0 (выравнивание на границу слова)
DWORD – сегмент начинается по адресу, кратному четырем, то есть два последних
(младших) значащих бита равным 0 (выравнивание на границу двойного слова)
PARA – сегмент начинается по адресу кратному 16, т.е. последняя шестнадцатеричная
цифра адреса должна быть 0h (выравнивание на границу параграфа)
PAGE – сегмент начинается по адресу, кратному 256, т.е. две последние
шестнадцатеричные цифры должны быть 00h (выравнивание на границу странице 256 байт)
MEMPAGE - сегмент начинается по адресу, кратному 4Кбайт, т.е. три последние
шестнадцатеричные цифры должны быть 000h (адрес следующей страницы памяти
размером 4Кбайт).
[тип_связи] (Атрибут комбинирования сегментов)сообщает компоновщику, как нужно
комбинировать сегменты различных модулей, имеющие одно и то же имя. По умолчанию атрибут
комбинирования сегмента принимает значение PRIVATE. Значения атрибутов могут быть:
PRIVATE – сегмент не будет объединяться с другими сегментами же именем вне данного
модуля.
PUBLIC – заставляет компоновщик соединить все сегменты с одинаковым именем. Новый
объединенный сегмент будет целым и непрерывным. Все адреса (смещения) объектов, а
это могут быть, в зависимости от типа сегмента, команды или данные, будут вычисляться
относительно начала этого нового сегмента.
COMMON – располагает все сегменты с одним и тем же именем по одному адресу. Размер
полученного в результате сегмента будет равен размер самого большого сегмента.
AT xxxx – располагает сегмент по абсолютному адресу параграфа (параграф - объем
памяти, кратный 16; поэтому последняя цифра адреса равна 0). Абсолютный адрес
параграфа задается выражением xxx.
STACK – определение сегмента стека. Заставляет компоновщик соединять все
одноименные сегменты и вычислять адреса в этих сегментах относительно регистра ss.
Регистр sp устанавливается на конец объединенного сегмента стека. Если сегмент стека
создан, а комбинированный тип STACK не используется, программист должен явно
загрузить в регистр ss адрес сегмента (подобно регистру ds)
                                       Лекция №5
                                    Псевдооператоры
                          Псевдооператор определения сегмента
Для работы с данными необходимо уметь определять сегменты и данные в них.
Пример определения сегмента данных:

DATASEG SEGMENT PARA PUBLIC DATA
A DB ?
B DB 10,20,30,40
C DW
DATASEG ENDS

где DATASEG – имя сегмента данных или адрес начала сегмента данных
SEGMENT – псевдооператор определения сегмента
Формат псеводооператора следующий
имя_сег SEGMENT [тип подгонки] [тип_связи] [‘класс’] [ тип размера памяти]
…..
имя_сег ENDS

[тип подгонки] – сообщает компоновщику о том, что нужно обеспечить размещение начала
сегмента на заданной границе. Это важно, т.к. при правильном выравнивании доступ к данным в
процессорах i80x86 выполняется быстрее. Допустимы следующие значения:
   • BYTE – выравнивание не выполняется. Сегмент может начинаться с любого адреса памяти.
   • WORD – сегмент начинается по адресу, кратному двум, т.е. последний (младший)
      значащий бит физического адреса равен 0 (выравнивание на границу слова)
   • DWORD – сегмент начинается по адресу, кратному четырем, то есть два последних
      (младших) значащих бита равным 0 (выравнивание на границу двойного слова)
   • PARA – сегмент начинается по адресу кратному 16, т.е. последняя шестнадцатеричная
      цифра адреса должна быть 0h (выравнивание на границу параграфа)
   • PAGE – сегмент начинается по адресу, кратному 256, т.е. две последние
      шестнадцатеричные цифры должны быть 00h (выравнивание на границу странице 256 байт)
   • MEMPAGE - сегмент начинается по адресу, кратному 4Кбайт, т.е. три последние
      шестнадцатеричные цифры должны быть 000h (адрес следующей страницы памяти
      размером 4Кбайт).
[тип_связи] (Атрибут комбинирования сегментов) – сообщает компоновщику, как нужно
комбинировать сегменты различных модулей, имеющие одно и то же имя. По умолчанию атрибут
комбинирования сегмента принимает значение PRIVATE. Значения атрибутов могут быть:
   • PRIVATE – сегмент не будет объединяться с другими сегментами же именем вне данного
      модуля.
   • PUBLIC – заставляет компоновщик соединить все сегменты с одинаковым именем. Новый
      объединенный сегмент будет целым и непрерывным. Все адреса (смещения) объектов, а
      это могут быть, в зависимости от типа сегмента, команды или данные, будут вычисляться
      относительно начала этого нового сегмента.
   • COMMON – располагает все сегменты с одним и тем же именем по одному адресу. Размер
      полученного в результате сегмента будет равен размер самого большого сегмента.
   • AT xxxx – располагает сегмент по абсолютному адресу параграфа (параграф - объем
      памяти, кратный 16; поэтому последняя цифра адреса равна 0). Абсолютный адрес
      параграфа задается выражением xxx.
   • STACK – определение сегмента стека. Заставляет компоновщик соединять все
      одноименные сегменты и вычислять адреса в этих сегментах относительно регистра ss.
      Регистр sp устанавливается на конец объединенного сегмента стека. Если сегмент стека
      создан, а комбинированный тип STACK не используется, программист должен явно
      загрузить в регистр ss адрес сегмента (подобно регистру ds)


                                            14