ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 12
- 13
- 14
- 15
- 16
- …
- следующая ›
- последняя »