Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Программирование нелинейных алгоритмов
Ранее вы познакомились с некоторыми командами, из которых формируются линейные участки программы. Каждая из них в общем случае выполняет некоторые действия по преобразованию или пересылке данных, после чего микропроцессор передает управление следующей команде. Но очень мало программ работают таким последовательным образом. Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей. Это решение может быть
Как вы помните, программа представляет собой последовательность команд и данных, занимающих определенное пространство оперативной памяти. Эта пространство памяти может быть либо непрерывным, либо состоять из нескольких фрагментов.
Таким образом, команды передачи управления изменяют содержимое регистров cs и eip/ip, в результате чего микропроцессор выбирает для выполнения не следующую по порядку команду программы, а команду в некотором другом участке программы. Конвейер внутри микропроцессора при этом сбрасывается. По принципу действия, команды микропроцессора, обеспечивающие организацию переходов в программе, можно разделить на три группы:
Возникает вопрос о том, каким образом обозначается то место, куда необходимо передать управление. В языке ассемблера это делается с помощью меток. Метка — это символическое имя, обозначающее определенную ячейку памяти, предназначенное для использования в качестве операнда в командах передачи управления.
Подобно переменной, транслятор ассемблера присваивает любой метке три атрибута:
Последний атрибут может принимать два значения:
Метку можно определить двумя способами:
Синтаксис первого способа показан на рис. 10.1.
Рис. 10.1. Синтаксис описания метки оператором: С помощью этого способа можно определить метку только ближнего типа — near. Символическое имя в программе может быть определено только один раз. Определенную таким образом метку можно использовать в качестве операнда в командах условного перехода jcc и безусловного перехода jmp, call. Эти команды, естественно, должны быть в сегменте кода, где определена метка. Команда ассемблера может находиться как на одной строке с меткой, так и на следующей.
Рис. 10.2. Синтаксис директивы label На рис. 10.2 тип метки принимает значения near или far. Обычно директиву label используют для определения идентификатора заданного типа. Например, следующие описания меток ближнего типа эквивалентны:
и
Понятно, что метка может быть только одного типа — либо near, либо far. Если возникает необходимость использовать для одной и той же команды метку и дальнего, и ближнего типов, то в этом случае необходимо определить две метки, причем метку дальнего типа нужно описать, используя директиву label, как показано в следующем фрагменте:
Определив для команды mov ax,pole_l две метки, можно организовывать переход на эту команду как из данного сегмента команд, так и из других сегментов команд, в том числе принадлежащих другим модулям. Для того чтобы сделать видимым извне имя метки m_fаr, применяется директива publiс. К более подробному описанию этой директивы мы еще вернемся.
Введем еще одно очень важное понятие ассемблера, имеющее прямое отношение к меткам, — счетчик адреса команд. Мы уже упоминали о нем и говорили, что транслятор ассемблера обрабатывает исходную программу, написанную пользователем, последовательно — команду за командой. При этом он ведет счетчик адреса команд, который для первой исполняемой команды равен нулю, а далее, по ходу обработки очередной команды транслятором, он увеличивается на длину этой команды. По сути, счетчик адреса команд — это смещение конкретной команды относительно начала сегмента кода. Таким образом, каждая команда во время трансляции имеет адрес, равный значению счетчика адреса команд. Первая колонка в листинге — номер строки листинга. Вторая колонка (или третья, если присутствует колонка с уровнем вложенности) — смещение команды относительно начала сегмента кода или, как мы сейчас определили, счетчик адреса. Значение, на которое он увеличивается по мере обработки ассемблером очередной строки исходной программы, равно значению длины машинной команды в этой строке. Исходя из этого, ясно, почему счетчик адреса растет только после тех строк исходной программы, которые генерируют некоторое машинное представление (в том числе после директив резервирования и инициализации данных в сегменте данных). Транслятор ассемблера обеспечивает нам две возможности работы с этим счетчиком:
После ассемблирования значение Len_Msg будет равно длине строки, так как значение символа $ в месте его появления отличается от Str_Mes ровно на длину строки.
Кроме возможности получения значения счетчика адреса, компилятор TASM позволяет при необходимости установить счетчик адреса в нужное абсолютное значение. Это делается с помощью директивы ORG. ORG выражение — задает значение счетчика адреса. Выражение должно быть таким, чтобы ассемблер мог преобразовать его к абсолютному числу при первом проходе трансляции. К примеру, эту директиву всегда используют при создании исполняемого файла с типом.com. В контексте нашего обсуждения поясним, в чем здесь суть. Мы обсуждали сегментацию и разделение программы на сегменты. Программа в СОМ-формате состоит из одного сегмента величиной не более 64 Кбайт. Сегментные регистры cs и ds содержат одно и то же значение физического адреса, а ss указывает на конец этого единственного сегмента. Программа-загрузчик операционной системы, считывая с диска исполняемые файлы типов.ехе и.com, производит определенные действия. В частности настраивает перемещаемые адреса программы на их конкретные физические значения. Кроме того, к началу каждой исполняемой программы в памяти добавляется специальная область величиной 256 байт (100h) — префикс программного сегмента (PSP). Он предназначен для хранения различной информации о загруженном исполняемом модуле. Для программ формата.com блок PSP находится в начале сегмента размером в 64 Кбайт. В исходной программе, для которой планируется формат исполняемого файла.com, мы должны предусмотреть место для блока PSP, что и делается директивой org 100h. Чтобы закончить разговор о файлах этого типа, разберемся с тем, как получить исполняемый модуль формата.com. Трансляция программы выполняется как обычно. Далее возможны два варианта действий:
Безусловные переходы
Безусловные переходы Предыдущее обсуждение выявило некоторые детали механизма перехода. Команды перехода модифицируют регистр указателя команды eip/ip и, возможно, сегментный регистр кода cs. Что именно должно подвергнуться модификации, зависит:
Модификатор может принимать следующие значения:
|
||||||||||||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 398; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.74.153 (0.015 с.) |