Главная страница
Навигация по странице:

  • Упрощенные директивы сегментации

  • Адрес в DS: 045F0Смещение: 0032Реальный адрес: 04622

  • Существует пять основных способов адресации: регистровая, непосредственная, прямая, косвенная и стековая.

  • Непосредственная адресация.

  • Косвенную и стековую адресации рассмотрим на следующем уроке.

  • ДИРЕКТИВЫ ОПРЕДЕЛЕНИЯ ДАННЫХ

  • Числовые константы

  • Шестнадцатеричный формат

  • Восьмеричный формат

  • урок 3. Лекция 3. Тема Сегменты. Способы адресации. Директивы определения данных


    Скачать 36.18 Kb.
    НазваниеЛекция 3. Тема Сегменты. Способы адресации. Директивы определения данных
    Дата06.10.2021
    Размер36.18 Kb.
    Формат файлаdocx
    Имя файлаурок 3.docx
    ТипЛекция
    #242246

    Лекция №3.

    Тема: Сегменты. Способы адресации. Директивы определения данных.

    Регистр — это определенный участок памяти внутри самого процессора, от 8-ми до 64-х бит длиной, который используется для промежуточного хранения информации, обрабатываемой процессором.

    1. Программа в машинном коде состоит из различных сегментов для определения данных, для хранения адресов, для машинных команд и для сегмента, названного стеком. Для выполнения арифметических действий, пересылки данных и адресации компьютер имеет ряд регистров.

    Для выполнения программ компьютер временно записывает программу и данные в основную память. Компьютер имеет также ряд регистров, которые он использует для временных вычислений

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

    Каждая программа содержит 3 типа сегментов:

    • Сегмент  кодов – содержит машинные команды для выполнения. Обычно первая выполняемая команда находится в начале этого сегмента, и операционная система передает управление по адресу данного сегмента  для выполнения программы. Регистр сегмента кодов (CS) адресует данный сегмент.

    • Сегмент данных – содержит данные, константы и рабочие  области, необходимые программе. Регистр сегмента данных (DS) адресует данный сегмент.

    • Сегмент стека — содержит адреса возврата как для программы (для возврата в операционную систему), так и для  вызовов подпрограмм (для возврата в главную программу), а также используется для передачи параметров в процедуры. Регистр сегмента стека (SS) адресует данный сегмент. Адрес текущей вершины стека задается регистрами SS:ESP.

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

    Упрощенные директивы сегментации

    Для задания сегментов в тексте программы можно пользоваться упрощенными директивами:

    • .CODE — для указания начала сегмента кода;

    • .DATA — для указания начала сегмента данных;

    • .STACK — для указания начала сегмента стека.

    Однако использование упрощенных директив сегментации не позволяет создать более трех сегментов для одной программы.

    Сегментом называется область, которая начинается на границе параграфа, то есть, по любому адресу, который делится на 16 без остатка.
    Хотя сегмент может располагаться в любом месте памяти и иметь размер до 64 Кбайт, он требует столько памяти, сколько необходимо для выполнения программы.

    Еще один сегментный регистр, регистр дополнительного сегмента (ES), предназначен для специального использования. Последовательность регистров и сегментов на практике может быть иной.
    Три сегментных регистра содержат начальные адреса соответствующих сегментов и каждый сегмент начинается на границе параграфа.
    Внутри программы все адреса памяти относительны к началу cегмента. Такие адреса называются смещением от начала сегмента. Двух байтовое смещение (16 бит) может быть в пределах от шест.0000 до шест.FFFF или от 0 до 65535. Для обращения к любому адресу в программе, компьютер складывает адрес в регистре сегмента и смещение. Например, первый байт в сегменте кодов имеет смещение 0, второй байт —
    01 и так далее до смещения 65535.
    В качестве примера адресации, допустим, что регистр сегмента данных содержит шест.045F и некоторая команда обращается к ячейке памяти внутри сегмента данных со смещением 0032. Несмотря на то, что регистр сегмента данных содержит 045F, он указывает на адрес 045F0, то есть, на границе параграфа. Действительный адрес памяти поэтому будет следующий:
    Адрес в DS: 045F0
    Смещение: 0032
    Реальный адрес: 04622


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

    • непосредственно в составе кода команды,

    • в каком-либо регистре,

    • в ячейке памяти;

    в последнем случае существует несколько возможностей указания его адреса.

    Строго говоря, способы адресации являются элементом архитектуры процессора, отражая заложенные в нем возможности поиска операндов. С другой стороны, различные способы адресации определенным образом обозначаются в языке ассемблера и в этом смысле являются разделом языка.
    Следует отметить неоднозначность термина "операнд" применительно к программам, написанным на языке ассемблера. Для машинной команды операндами являются те данные (в сущности, двоичные числа), с которыми она имеет дело. Эти данные могут, как уже отмечалось, находиться в регистрах или в памяти. Если же рассматривать команду языка ассемблера, то для нее операндами (или, лучше сказать, параметрами) являются те обозначения, которые позволяют сначала транслятору, а потом процессору определить местонахождение операндов машинной команды. Так, для команды ассемблера mov mem, AX

    в качестве операндов используется обозначение ячейки памяти mem, a также обозначение регистра АХ. В то же время, для соответствующей машинной команды операндами являются содержимое ячейки памяти и содержимое регистра. Было бы правильнее говорить об операндах машинных команд и о параметрах, или аргументах команд языка ассемблера.
    По отношению к командам ассемблера было бы правильнее использовать термин "параметры", оставив за термином "операнд" обозначение тех физических объектов, с которыми имеет дело процессор при выполнении машинной команды, однако обычно эти тонкости не принимают в расчет, и говоря об операндах команд языка, понимают в действительности операнды машинных команд.
    В книгах, посвященных языку ассемблера, можно встретить разные подходы к описанию способов адресации: не только названия этих режимов, но даже и их количество могут различаться. Разумеется, способов адресации существует в точности столько, сколько их реализовано в процессоре; однако, режимы адресации можно объединять в группы по разным признакам, отчего и создается некоторая путаница, в том числе и в количестве имеющихся режимов. Но есть и единая терминология. Существует пять основных способов адресации: регистровая, непосредственная, прямая, косвенная и стековая.
    Регистровая адресация.  Операнд (байт или слово) находится в регистре. Этот способ адресации применим ко всем программно-адресуемым регистрам процессора.

    inc СН ; плюс 1 к содержимому СН
    push DS ; DS сохраняется в стеке
    xchg ВХ, ВР ; ВХ и ВР обмениваются содержимым
    mov ES, АХ; содержимое АХ пересылается в ES

    Непосредственная адресация. Операнд (байт или слово) указывается в команде и после трансляции поступает в код команды; он может иметь любой смысл (число, адрес, код ASCII), а также быть представлен в виде символического обозначения.

    mov АН, 40h ; число 40h загружается в АН
    mov AL,'*' ; код ASCII символа "*' загружается в AL
    int 21h ; команда прерывания с аргументом 21h
    limit = 528 ; число 528 получает обозначение limit
    mov CX,limit ; число, обозначенное limit, загружается в СХ

    Команда mov, использованная в последнем предложении, имеет два операнда;

    первый операнд определяется с помощью регистровой адресации,

    второй - с помощью непосредственной.

    Важным применением непосредственной адресации является пересылка относительных адресов (смещений). Чтобы указать, что речь идет об относительном адресе данной ячейки, а не об ее содержимом, используется описатель onset (смещение):

    ; сегмент данных
    mes db "Урок 1' ; строка символов
    ; сегмент команд
    mov DX, offset mes ; адрес строки засылается в DX

    В приведенном примере относительный адрес строки mes, т.е. расстояние в байтах первого байта этой строки от начала сегмента, в котором она находится, заносится в регистр DX.
    Прямая адресация памяти. Адресуется память

    адрес ячейки памяти (слова или байта) указывается в команде (обычно в символической форме) и поступает в код команды:

    ; Сегмент данных
    meml dw 0 ; Слово памяти содержит 0
    mem2 db 230 ; Байт памяти содержит 230
    ; Сегмент команд
    inc meml ; Содержимое слова meml увеличивается на 1
    mov DX, meml ; Содержимое слова с именем meml загружается в DX
    mov AL,mem2 ; Содержимое байта с именем mem2 загружается в АL

    Сравнивая этот пример с предыдущим, мы видим, что указание в команде имени ячейки памяти обозначает, что операндом является содержимое этой ячейки; указание имени ячейки с описателем offset - что операндом является адрес ячейки.
    Прямая адресация памяти на первой взгляд кажется простой и наглядной. Если мы хотим обратиться, например, к ячейке meml, мы просто указываем ее имя в программе. В действительности, однако, дело обстоит сложнее. Вспомним, что адрес любой ячейки состоит из двух компонентов: сегментного адреса и смещения. Обозначения meml и mem2 в предыдущем примере, очевидно, являются смещениями. Сегментные же адреса хранятся в сегментных регистрах. Однако сегментных регистров четыре: DS, ES, CS и SS. Каким образом процессор узнает, из какого регистра взять сегментный адрес, и как сообщить ему об этом в программе?
    Процессор различает группу кодов, носящих название префиксов. Имеется несколько групп префиксов: повторения, размера адреса, размера операнда, замены сегмента. Здесь нас будут интересовать префиксы замены сегмента.
    Команды процессора, обращающиеся к памяти, могут в качестве первого байта своего кода содержать префикс замены сегмента, с помощью которого процессор определяет, из какого сегментного регистра взять сегментный адрес. Для сегментного регистра ES код префикса составляет 26h, для SS - 361i, для CS - 2Eh. Если префикс отсутствует, сегментный адрес берется из регистра DS (хотя для него тоже предусмотрен свой префикс).
    Если в начале программы с помощью директивы assume указано соответствие сегменту данных сегментного регистра DS

    assumeDS:data

    то команды обращения к памяти транслируются без какого-либо префикса, а процессор при выполнении этих команд берет сегментный адрес из регистра DS.
    Если в директиве assume указано соответствие сегмента данных регистру ES

    assumeES:data

    (в этом случае сегмент данных должен располагаться перед сегментом команд), то команды обращения к полям этого сегмента транслируются с добавлением префикса замены для сегмента ES. При этом предложения программы выглядят обычным образом; в них по-прежнему просто указываются имена полей данных, к которым производится обращение.
    Однако в ряде случаев префикс замены сегмента должен указываться в программе в явной форме. Такая ситуация возникает, например, если данные расположены в сегменте команд, что типично для резидентных обработчиков прерываний. Для обращения к таким данным можно, конечно, использовать регистр DS, если предварительно настроить его на сегмент команд, но проще выполнить адресацию через регистр CS, который и так уже настроен должным образом. Если в сегменте команд содержится поле данных с именем mem, то команда чтения из этого поля будет выглядеть следующим образом:

    movAX,CS:mem

    В этом случае транслятор включит в код команды префикс замены для сегмента CS.

    Косвенную и стековую адресации рассмотрим на следующем уроке.

    Директивы.
    Директивы являются указаниями Ассемблеру о том, как проводить ассемблирование.
    Директив может быть великое множество. Мырассмотрим лишь несколько практически обязательных директивы(мнемоники директив везде — условные, в конкретных Ассемблерах теже по смыслу директивы могут иметь другие мнемоники).
    EQU(Определение имени).Перед этой директивой обязательно стоит имя. Операнд этой директивы определяет значение имени.Операндом может быть и выражение, вычисляемое при ассемблировании. Имя может определяться и через другое имя, определенное выше. Не допускается определение имени со ссылкой вперед.
    DD (Определение данных).Выделяются ячейки памяти и в них записываются значения, определяемые операндом директивы.Перед директивой может стоять метка/имя. Как правило, однойдирективой могут определяться несколько объектов данных.
    В конкретных Ассемблерах может существовать либо одна общаядиректива DD, тогда тип данных, размещаемых в памяти определяетсяформой записи операндов, либо несколько подобных директив — дляразных типов данных.В отличие от других, эта директива приводит непосредственной кгенерации некоторого выходного кода — значений данных.
    BSS (Резервирование памяти).Выделяются ячейки памяти, но значения в них не записываются.Объем выделяемой памяти определяется операндом директивы.
    Перед директивой может стоять метка/имя.

    END (Конец программного модуля).Указание Ассемблеру на прекращение трансляции. Обычно в модуле, являющемся главным (main) операндом этой директивы является
    имя точки, на которую передается управление при начале выполненияпрограммы. Во всех других модулях эта директива употребляется без операндов.

    ДИРЕКТИВЫ ОПРЕДЕЛЕНИЯ ДАННЫХ
    Сегмент данных предназначен для определения констант, рабочих полей и областей для вводавывода. В соответствии с имеющимисядирективами в Ассемблере разрешено определение данных различнойдлины: например, директива DB определяет байт, а директива DW oпределяет слово. Элемент данных может содержать непосредственное значение или константу, определенную как символьная строка или как числовое значение.
    Другим способом определения константы является непосредственное значение, то есть, указанное прямо в ассемблерной команде, например:
    MOV AL,20H
    В этом случае шестнадцатеричное число 20 становится частью машинного объектного кода. Непосредственное значение ограниченоoдним байтом или одним словом, но там, где оно может быть применено, оно является более эффективным, чем использование конcтанты. Ассемблер обеспечивает два способа определения данных: вопервых, через указание длины данных и, вовторых, поихcодержимому.
    Рассмотрим основной формат определения данных:
    [имя] Dn выражение
    Имя элемента данных не обязательно (это указывается квадратными скобками), но если в программе имеются ссылки на некоторыйэлемент, то это делается посредством имени. Для определения элементов данных имеются следующие директивы:

    DB (байт), DW (слово), DD (двойное слово), DQ (учетверенное слово) и DT (десять байт).имя ссылки
    Выражение может содержать константу, например:FLD1 DB 25
    или знак вопроса для неопределенного значения, напримерFLDB DB ?
    Выражение может содержать несколько констант, разделенныхзапятыми и ограниченными только длиной строки:FLD3 DB 11, 12, 13, 14, 15, 16, ...
    Ассемблер определяет эти константы в виде последовательностиcмежных байт.
    Ссылка по имени FLD3 указывает на первую константу, 11, поFLD3+1 — на вторую, 12. (FLD3 можно представить как FLD3+0).

    Например командаMOV AL,FLD3+3загружает в регистр AL значение 14 (шест. 0E). Выражение допускает также повторение константы в следующем формате:
    [имя] Dnчислоповторений DUP (выражение) ...
    Следующие три примера иллюстрируют повторение:
    DW 10 DUP(?);Десять неопределенных слов
    DB 5 DUP(14);Пять байт, содержащих шест.14
    DB 3 DUP(4 DUP(8));Двенадцать восьмерок
    В третьем примере сначала генерируется четыре копии десятичной 8 (8888), и затем это значение повторяется три раза, давая в pезультате двенадцать восьмерок.
    Выражение может содержать символьную строку или числовуюконстанту.
    Символьные строки
    Символьная строка используются для описания данных, такихкак, например, имена людей или заголовки страниц. Содержимое строки oтмечается одиночными кавычками, например, 'PC' или двойнымикавычками — "PC".
    Ассемблер переводит символьные строки в объектный код в обычном формате ASCII.
    Символьная строка определяется только директивой DB, в котоpой указывается более двух символов в нормальной последовательности слева направо. Следовательно, директива DB представляет единственно возможный формат для определения символьных данных.

    Числовые константы
    Числовые константы используются для арифметических величини для aдресов памяти. Для описания константы кавычки не ставятся. Ассемблер преобразует все числовые константы в шестнадцатеричные и записывает байты в объектном коде в обратной последовательности —справа налево. Есть различные числовые форматы.
    Десятичный формат
    Десятичный формат допускает десятичные цифры от 0 до 9 и обозначается последней буквой D, которую можно не указывать, например,125 или 125D. Несмотря на то, что Ассемблер позволяет кодирование вдесятичном формате, он преобразует эти значения в шест.объектныйкод. Например, десятичное число 125 преобразуется в шест.7D.
    Шестнадцатеричный формат
    Шестнадцатеричный формат допускает шест.цифры от 0 до F иобозначается последней буквой H.
    Так как Ассемблер полагает, что с буквы начинаются идентификаторы, то первой цифрой шест.константы должна быть цифра от 0 до 9.
    Например, 2EH или 0FFFH, которые Ассемблер преобразует соответственно в 2E и FF0F (байты во втором примере записываются в объектный код в обратной последовательности).

    Исходный код или исходный текст - текст на языке программирования, который пишет человек (как правило, человек). Это обычный текстовый файл (как правило). Но процессоры в компьютеры способны понимать только чрезвычайно простой машинный код.
    Поэтому любая программа прямо или косвенно превращается из исходного кода в машинный и только после этого исполняется компьютером.
    Объектный код - это промежуточное представление кода. Еще не машинный, но уже не исходный. Используется на этапе сборки программы из нескольких кусков (возможно, написанных в исходном коде разными людьми и в разное время).
    Машинный код - уже готов для исполнения. То есть просто берете его, ничего не нужно более. Делаете двойной щелчок мыши, к примеру, и программа запускается.
    Двоичный формат
    Двоичный формат допускает двоичные цифры 0 и 1 и обозначается последней буквой B. Двоичный формат обычно используется для более четкого представления битовых значений в логических командахAND, OR, XOR и TEST. Десятичное 12, шест. C и двоичное 1100B все генерируют один и тот же код: шест. 0C или двоичное 0000 1100 в зависимости от того, как вы рассматриваете содержимое байта.
    Восьмеричный формат
    Восьмеричный формат допускает восьмеричные цифры от 0 до 7 иобозначается последней буквой Q или O, например, 253Q. На сегоднявосьмеричный формат используется весьма редко.
    Десятичный формат с плавающей точкой
    Этот формат поддерживается только Ассемблером МASM. Призаписи символьных и числовых констант следует помнить, что, например, символьная константа, определенная как DB '12', представляет символы ASCII и генерирует шест.3132, а числовая константа, oпределеннаякак DB 12, представляет двоичное число и генерирует шест.0C.


    написать администратору сайта