REFERATUA.ORG.UA — База українських рефератів




модель микропроцессора", там, где мы описывали назначение регистров общего назначения.
В контексте нашего рассмотрения нас интересуют регистры sp и bp. Если микропроцессор видит в качестве операнда (или его части, если операнд - выражение) один из этих регистров, то по умолчанию он формирует физический адрес операнда используя в качестве его сегментной составляющей содержимое регистра ss. Что подразумевает термин "по умолчанию"? Вспомните "рефлексы", о которых мы говорили на уроке 1. Это набор микропрограмм в блоке микропрограммного управления, каждая из которых выполняет одну из команд в системе машинных команд микропроцессора. Каждая микропрограмма работает по своему алгоритму. Изменить его, конечно же, нельзя, но можно чуть-чуть подкорректировать. Делается это с помощью необязательного поля префикса машинной команды (см. формат машинной команды). Если мы согласны с тем, как работает команда, то это поле отсутствует. Если же мы хотим внести поправку (если, конечно, она допустима для конкретной команды) в алгоритм работы команды, то необходимо сформировать соответствующий префикс.
Префикс представляет собой однобайтовую величину, численное значение которой определяет ее назначение. Микропроцессор распознает по указанному значению, что этот байт является префиксом, и дальнейшая работа микропрограммы выполняется с учетом поступившего указания на корректировку ее работы. Сейчас нас интересует один из них - префикс замены (переопределения) сегмента. Его назначение состоит в том, чтобы указать микропроцессору (а по сути, микропрограмме) на то, что мы не хотим использовать сегмент по умолчанию. Возможности для подобного переопределения, конечно, ограничены. Сегмент команд переопределить нельзя, адрес очередной исполняемой команды однозначно определяется парой cs:ip. А вот сегменты стека и данных - можно. Для этого и предназначен оператор ":". Транслятор ассемблера, обрабатывая этот оператор, формирует соответствующий однобайтовый префикс замены сегмента. Например,

.code

...

jmp met1 ;обход обязателен, иначе поле ind

будет трактоваться ;как очередная команда

ind db 5 ;описание поля данных в сегменте команд

met1:

...

mov al,cs:ind ;переопределение сегмента позволяет работать с

;данными, определенными внутри сегмента кода

  • Assembler

  • Рис. 11. Синтаксис оператора переопределения сегмента

  • Оператор именования типа структуры . (точка) также заставляет транслятор производить определенные вычисления, если он встречается в выражении.

  • Оператор получения сегментной составляющей адреса выраженияseg возвращает физический адрес сегмента для выражения (рис. 12), в качестве которого могут выступать метка, переменная, имя сегмента, имя группы или некоторое символическое имя.

    Assembler

    Рис. 12. Синтаксис оператора получения сегментной составляющей

    • Оператор получения смещения выраженияoffset позволяет получить значение смещения выражения (рис. 13) в байтах относительно начала того сегмента, в котором выражение определено.

    Assembler

    Рис. 13. Синтаксис оператора получения смещения

    Например,

    .data

    pole dw 5

    ...

    .code

    ...

    mov ax,seg pole

    mov es,ax

    mov dx,offset pole ;теперь в паре es:dx полный адрес pole

    Как и в языках высокого уровня, выполнение операторов ассемблера при вычислении выражений осуществляется в соответствии с их приоритетами (см. табл. 2). Операции с одинаковыми приоритетами выполняются последовательно слева направо. Изменение порядка выполнения возможно путем расстановки круглых скобок, которые имеют наивысший приоритет.

    Таблица 2. Операторы и их приоритет

    Оператор

    Приоритет

    length, size, width, mask, (, ), [, ], <, >

    1

    .

    2

    :

    3

    ptr, offset, seg, type, this

    4

    high, low

    5

    +, - (унарные)

    6

    *, /, mod, shl, shr

    7

    +, -, (бинарные)

    8

    eq, ne, lt, le, gt, ge

    9

    not

    10

    and

    11

    or, xor

    12

    short, type

    13

    Директивы сегментации

    В ходе предыдущего обсуждения мы выяснили все основные правила записи команд и операндов в программе на ассемблере. Открытым остался вопрос о том, как правильно оформить последовательность команд, чтобы транслятор мог их обработать, а микропроцессор - выполнить.

    При рассмотрении архитектуры микропроцессора мы узнали, что он имеет шесть сегментных регистров, посредством которых может одновременно работать:

    • с одним сегментом кода;

    • с одним сегментом стека;

    • с одним сегментом данных;

    • с тремя дополнительными сегментами данных.

    Еще раз вспомним, что физически сегмент представляет собой область памяти, занятую командами и (или) данными, адреса которых вычисляются относительно значения в соответствующем сегментном регистре.

    Синтаксическое описание сегмента на ассемблере представляет собой конструкцию, изображенную на рис. 14:

    Assembler

    Рис. 14. Синтаксис описания сегмента

    Важно отметить, что функциональное назначение сегмента несколько шире, чем простое разбиение программы на блоки кода, данных и стека. Сегментация является частью более общего механизма, связанного с концепцией модульного программирования. Она предполагает унификацию оформления объектных модулей, создаваемых компилятором, в том числе с разных языков программирования. Это позволяет объединять программы, написанные на разных языках. Именно для реализации различных вариантов такого объединения и предназначены операнды в директиве SEGMENT.
    Рассмотрим их подробнее.

    • Атрибут выравнивания сегмента (тип выравнивания) сообщает компоновщику о том, что нужно обеспечить размещение начала сегмента на заданной границе. Это важно, поскольку при правильном выравнивании доступ к данным в процессорах i80х86 выполняется быстрее. Допустимые значения этого атрибута следующие:

      • BYTE - выравнивание не выполняется. Сегмент может начинаться с любого адреса памяти;

      • WORD - сегмент начинается по адресу, кратному двум, то есть последний (младший) значащий бит физического адреса равен 0 (выравнивание на границу слова);

      • DWORD - сегмент начинается по адресу, кратному четырем, то есть два последних (младших) значащих бита равны 0 (выравнивание на границу двойного слова);

      • PARA - сегмент начинается по адресу, кратному 16, то есть последняя


  •  
    Загрузка...