Для того чтобы посмотреть содержимое нашего сегмента данных, нужно остановить выполнение программы после этих двух команд. Это можно сделать, если перевести отладчик в пошаговый режим с помощью клавиши F7 или F8. Нажмите два раза клавишу F8. Теперь можно открыть окно Dump.
В окне Dump вызовите контекстное меню, щелкнув правой кнопкой мыши, и выберите команду Goto. Появится диалоговое окно, в котором нужно ввести начальный адрес памяти, начиная с которого информация будет выводиться в окне Dump. Синтаксис задания этого адреса должен соответствовать синтаксису задания адресного операнда в программе на ассемблере. Если нужно увидеть содержимое памяти для сегмента данных, начиная с начала, введите ds:0000 (рис. 5.20). Для удобства, если сегмент довольно велик, это окно можно развернуть на весь экран. Для этого нужно щелкнуть на значке в виде стрелки (↑) в правом верхнем углу окна Dump.
На рисунке представлено содержание сегмента данных программы из листинга 5.3 в двух представлениях: шестнадцатеричном и символьном. Видно, что со смещением 0000 расположены символы, входящие в строку message. Она занимает 34 байта. После нее следует байт, имеющий в сегменте данных символическое имя perem_l, содержимое этого байта — offh. Теперь обратите внимание на то, как размещены в памяти байты, входящие в слово, обозначенное символическим именем pегem_2. Сначала следует байт со значением 7fh, а затем — со значением 3ah. Как видим, в памяти действительно сначала расположен младший байт значения, а за тем старший. Теперь проанализируйте порядок размещения байтов для поля, обозначенного символическим именем perem_3. Оставшаяся часть сегмента данных не представляет трудности для самостоятельного анализа. Есть смысл остановиться лишь на двух специфических особенностях использования директив резервирования и инициализации памяти.
|
|
Речь идет об указании в поле операндов директив DWи DD идентификатора из поля имени этой или другой директивы резервирования и инициализации памяти. В нашем примере сегмента данных это директивы с идентификаторами adr и adr_full. Когда транслятор встречает директивы описания памяти с подобными операндами, то он формирует в памяти значения адресов тех переменных, чьи идентификаторы указаны в качестве операндов. В зависимости от директивы, применяемой для получения такого адреса, формируется полный адрес (директива DD) в виде двух байтов сегментного адреса и двух байтов смещения, либо только смещение (директива dw). Для тренировки найдите в представленном дампе поля, соответствующие идентификаторам adr и adr_full, и проанализируйте их содержимое.
|
|
Любой переменной, объявленной с помощью директив описания простых типов данных, ассемблер присваивает три атрибута:
сегмент (seg) — адрес начала сегмента, содержащего переменную;
смещение (offset) в байтах от начала сегмента с переменной;
тип (type) — объем памяти, выделяемой переменной в соответствии с директивой объявления переменной.
Получить и использовать значение этих атрибутов в программе можно с помощью операторов ассемблера SEG, OFFSETи TYPE.
В заключение отметим, что в языке ассемблера существуют средства для описания сложных типов данных, основой которых являются описанные в этой главе простые типы данных. Подробному обсуждению сложных типов данных посвящена глава 13.
Итоги
· Программа на ассемблере, отражая особенности архитектуры процессора, состоит из сегментов — блоков памяти, допускающих независимую адресацию.
· Каждый сегмент может состоять из предложений языка ассемблера четырех типов: команд ассемблера, макрокоманд, директив ассемблера и строк комментариев.
· Формальное описание синтаксиса языков программирования, в том числе ассемблера, удобно выполнять с использованием таких метасинтаксических языков, как синтаксические диаграммы и нормальные формы Бэкуса-Наура. Синтаксические диаграммы более наглядны, а расширенные формы Бэкуса-Наура более компактны.
· Предложения ассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка, имеющие смысл для транслятора.
· Ассемблер допускает большое разнообразие типов операндов, которые могут задаваться неявно или содержаться непосредственно в команде, в регистрах и в памяти. В двухоперандной машинной команде возможны следующие сочетания операндов:
· регистр — регистр;
· регистр — память;
· память — регистр;
· непосредственный операнд — регистр;
· непосредственный операнд — память.
· Операндами в команде могут быть числа, регистры, ячейки памяти, символьные идентификаторы. При необходимости операнд может быть задан выражением.
· Ассемблер позволяет организовать гибкую прямую и косвенную адресацию операндов в памяти.
· Исходный текст программы разбивается на сегменты с помощью директив сегментации, которые делятся на стандартные и упрощенные.
· Упрощенные директивы сегментации позволяют унифицировать интерфейс с языками высокого уровня и облегчают разработку программ, повышая наглядность кода.
· Транслятор ТASM поддерживает разнообразные типы данных, которые делятся на простые (базовые) и сложные. Простые типы служат основой для построения сложных типов данных.
· Директивы описания простых типов данных позволяют резервировать и при необходимости инициализировать области памяти заданной длины.
· Доступ к памяти должен производиться с учетом принципа их размещения процессорами IA-32 – «младший байт по младшему адресу».
· Каждой переменной, объявленной с помощью директивы описания данных, ассемблер назначает атрибуты, доступ к которым можно получить с помощью соответствующих операторов ассемблера.
Контрольные вопросы
1. Основные типы данных (с точки зрения размерности)?
2. Типы данных (с точки зрения логической интерпретации)?
3. Директивы резервирования и инициализации данных – назначение?
4. Директива DB – назначение, директивой DB можно задавать следующие значения…?
5. Директива DW – назначение, директивой DW можно задавать следующие значения…?
6. Директива DD – назначение, директивой DD можно задавать следующие значения…?
7. Директивы DF и DP – назначение, директивам можно задавать следующие значения…?
8. Директива DQ – назначение, директивой DB можно задавать следующие значения…?
9. Директива DT – назначение, директивой DT можно задавать следующие значения…?
10. Принцип «младший байт по младшему адресу» - суть принципа?