Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Общие принципы программирования - Программирование от RIN.RU
Общие принципы программирования



Сегменты и группы


Способ, с помощью которого Турбо Ассемблер обрабатывает в режиме Ideal сегменты и группы, может внести большое различие в формирование и выполнение программ. Как и большинству людей, вам, вероятно, не захочется ломать голову над ошибками, возникающими из-за взаимодействия сегментов и групп.


Большинство трудностей в этом процессе возникает из-за произвольного характера предположений в MASM (и следовательно Турбо Ассемблером в режиме MASM) о ссылках на данные или код в группах. К счастью, режим Ideal сглаживает некоторые наиболее явные проблемы, которые могут вызвать директивы определения сегментов и групп в MASM. Об этом мы и расскажем далее.


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


В режиме Ideal любой элемент данных в сегменте, являющемся частью группы, рассматривается строго как элемент группы, а не сегмента. В Турбо Ассемблере для распознавания элемента данных, как элемента сегмента, нужно использовать явное переопределение сегмента.


В режиме MASM это интерпретируется по-другому. Иногда идентификаторы считается частью сегмента, а не частью группы. В частности, в режиме MASM идентификатор интерпретируется, как часть сегмента, когда он используется, как указатель на выделенные данные. Это может вызвать путаницу, так как когда вы непосредственно обращаетесь к данным без операции OFFSET, MASM некорректно генерирует ссылку на сегмент вместо ссылки на группу.


Пример поможет нам пояснить, как легко можно нажить неприятности из-за специфики адресации в MASM. Рассмотрим следующую неполную программу MASM, в которой описываются три сегмента данных:


dseg1 SEGMENT para public "data"


v1 db 0
dseg1 ENDS


dseg2 SEGMENT para public "data"
v2 db 0
dseg2 ENDS


dseg3 SEGMENT para public "data"
v3 db 0
dseg3 ENDS


DGROUP GROUP dseg1,dseg2,dseg3
cseg SEGMENT para public "code"


ASSUME cs:cseg,ds:DGROUP


start:
mov ax,OFFSET v1
mov bx,OFFSET v2
mov cx,OFFSET v3
cseg ENDS
END start


Три сегмента dseg1, dseg2 и dseg3 группируются под одним именем DGROUP. В результате все переменные отдельных сегментов хранятся в памяти вместе. В исходном тексте программы в каждом из отдельных сегментов описывается байтовая переменная (метки v1, v2 и v3).


В коде данной программы MASM в регистры AX, BX и CX загружаются смещения адресов этих переменных. В соответствии с предшествующей директивой ASSUME и из-за того, что сегменты данных сгруппированы вместе, вы можете подумать, что MASM будет вычислять смещения переменных относительно всей группы, в которой переменные очевидно хранятся в памяти.


Но произойдет совсем не это! Вопреки вашим намерениям MASM вычисляет смещения переменных относительно отдельных сегментов dseg1, dseg2 и dseg3. Он делает это несмотря на то, что все три сегмента данных сгруппированы в памяти в один сегмент данных, адресуемый через регистр DS. Бессмысленно определять смещения переменных относительно отдельных сегментов в тексте программы, когда эти сегменты скомбинированы в памяти в один сегмент. Единственный способ ссылки на такие переменные состоит в ссылке на их смещения относительно всей группы.


Чтобы избавиться в MASM от этой проблемы, вам потребуется наряду с ключевым словом OFFSET задавать имя группы:


mov ax,OFFSET DGROUP:v1
mov bx,OFFSET DGROUP:v2
mov cx,OFFSET DGROUP:v3




Хотя теперь это ассемблируется корректно и загружаются смещения переменных v1, v2 и v3 относительно DGROUP (где собраны отдельные сегменты), вы можете легко забыть задать квалификатор DGROUP. Если вы сделаете эту ошибку, значения смещений не позволят корректно определить переменные в памяти, и вы не получите в MASM никакого указания, что что-то произошло не так. Режим Ideal позволяет избежать таких неприятностей:


IDEAL
SEGMENT dseg1 para public "data"
v1 db 0
ENDS


SEGMENT dseg2 para public "data"
v2 db 0
ENDS


SEGMENT dseg3 para public "data"
v3 db 0
ENDS


GROUP DGROUP dseg1, dseg2, dseg3
SEGMENT cseg para public "code"


ASSUME cs:cseg,ds:DGROUP


start:
mov ax,OFFSET v1
mov bx,OFFSET v2
mov cx,OFFSET v3
ENDS
END start


Смещения переменных v1, v2 и v3 корректно вычисляются относительно группы, в которой собраны отдельные сегменты, которым принадлежат переменные. В режиме Ideal квалификатор DGROUP для ссылки на переменные в сегментах группы не требуется. В режиме MASM этот квалификатор также не является необходимым, но, что хуже всего, не выдается никаких предупреждений, если вы забыли в конкретной ссылке определить имя группы.


Комментарии в программах


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


Комментарии в конце строки


Комментировать код Ассемблера можно несколькими способами. Один из методов состоит в добавлении комментария в конец строки, используя точку с запятой, например:


mov [bx],a1 ; записать измененный символ


Другой способ комментирования исходного кода заключается в использовании в качестве символа комментария символа продолжения строки (\). (См. ниже раздел "Продолжение строки").


Директива COMMENT


Директива COMMENT позволяет вам комментировать блок исходного кода. COMMENT позволяет игнорировать весь текст, начиная от первого символа-ограничителя и до строки, содержащей следующее вхождение ограничителя. В следующем примере в качестве ограничителя используется символ *:


COMMENT *
здесь следуют замечания
*
Примечание: Директива COMMENT работает только в режиме MASM.


<<<  НазадВперед  >>>
 1  2  3  4  5  6  7 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Начало работы на Турбо Ассемблере

Использование директив и параметров

Объектно-ориентированное программирование

Использование выражений и значений идентификаторов

Директивы выбора процессора

Использование моделей памяти программы и сегментации

Определение типов данных

Задание и использование счетчика адреса

Описание процедур

Управление областью действия идентификаторов

Определение данных

Расширенные инструкции

Использование макрокоманд

Использование условных директив

Интерфейс с компоновщиком

Генерация листинга

Интерфейс Турбо Ассемблера и Borland C++

Интерфейс Турбо Ассемблера с Турбо Паскалем

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь