Mov ds.ax

Для того чтобы посмотреть содержимое нашего сегмента данных, нужно оста­новить выполнение программы после этих двух команд. Это можно сделать, если перевести отладчик в пошаговый режим с помощью клавиши 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. Принцип «младший байт по младшему адресу» - суть принципа?



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: