CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
Комментарии
-----------------------------------------------------------------
Расскажем наконец, что представляет собой поле комментария.
Комментарии не выполняют никаких реальных действий в том смысле,
что они не влияют на код выполняемого Турбо Ассемблером файла. Но
это не означает, что они не являются существенными.
Вероятно, вы уже знаете, как программировать на языке высо-
кого уровня (Си, Паскале, Прологе или другом), поскольку очень
немногие начинают свое знакомство с программированием с Ассембле-
ра. По мере знакомства с этим языком вы будете вновь и вновь
встречаться с советами и рекомендациями по необходимости акку-
ратной записи комментариев. Это прекрасный совет, так как и слож-
ность, и время, прошедшее с момента ее написания, могут сделать
программу совершенно непонятной даже для ее автора.
По сравнению с языком Ассемблера программа, например, на
Паскале гораздо более наглядна. Программы Паскаля хорошо структу-
рированы, он имеет жестко типизованные переменные, арифметические
выражения, вызовы процедур и функций с формальными и фактическими
параметрами.
Ассемблер же не имеет встроенных управляющих структур, жест-
кой принудительной типизации данных, включающих переменные ариф-
метических выражений и присущего ему механизма передачи парамет-
ров. Короче говоря, код Ассемблера - это не тот хорошо структури-
рованный и легко обслуживаемый текст, к которым вы, возможно,
встречались. Поэтому, чтобы поднять Ассемблер до уровня естест-
венного кодирования, вы должны широко пользоваться комментариями,
а также подпрограммами и макрокомандами.
Имеется много способов включения в код Ассемблера коммента-
риев. Один из наиболее полезных подходов состоит в том, чтобы
слева от каждой инструкции помещать комментарий, в котором содер-
жится ее краткое пояснение. Например, инструкция:
mov [bx],al ; сохранить измененный символ
выглядит более понятной, чем инструкция
mov [bx],al
Необязательно комментировать каждую строку. Например, ком-
ментарии типа:
.
.
.
mov ah,1 ; функция DOS ввода с клавиатуры
int 21h ; вызвать DOS, чтобы получить
; следующую нажатую клавишу
.
.
.
не служат никакой полезной цели. Это, однако, не означает, что
комментировать такие строки не следует. Просто делайте коммента-
рии более короткими:
.
.
.
mov ah,1
int 21h ; получить следующую клавишу
.
.
.
Нужно помнить о том, что целью комментариев является не объ-
яснение каждого элемента вашей программы, а облегчение анализа ее
текста и понимания (вами или кем-либо другим).
Другим хорошим методом комментирования является использова-
ния для пояснения блоков кода строк-комментариев. Такие коммента-
рии могут описывать работу программы на более высоком уровне, чем
комментарии отдельных строк. Рассмотрим следующий пример:
.
.
.
;
; Сгенерировать для буфера передачи байт контрольной суммы
;
mov bx,OFFSET TransferBuffer
mov cx,TRANSFER_BUFFER_LENGTH
sub al,al ; очистить аккумулятор контрольной суммы
CheckSum:
add al,[bx] ; добавить в него текущее значение байта
inc bx ; указать на следующий байт
.
.
.
Обратите внимание, что мы не включаем комментарий в каждую
строку. Из комментариев данного блока программы видно, что в ре-
гистр BX загружается адрес буфера передачи, а в CX - длина буфе-
ра. В комментарии к этому блоку из семи строк кратко суммируется
его работа, поэтому комментарии каждой строки становятся менее
важными. Если кто-нибудь будет просматривать программу, то он
больше полезного извлечет из комментариев к блокам, чем из ком-
ментариев к строкам.
Другой метод комментирования еще более высокого уровня сос-
тоит во включении перед каждой подпрограммой описательного заго-
ловка-комментария ("шапки" программы). Такой заголовок может со-
держать описание подпрограммы, ее входные и выходные значения и
различные замечания по ее работе. Например:
;
; Функция, возвращающая контрольную сумму (размером в
; байт) буфера данных
;
; Входные данные:
; DS:BX - указатель на начало буфера
; CX - длина буфера
;
; Выходные данные:
; AL - контрольная сумма буфера
;
; Используемые регистры (содержимое не сохраняется):
; BX, CX
;
; Примечание: буфер не должен превышать 64К и не должен
; пересекать границу сегментов.
;
CheckSum PROC NEAR
sub al,al ; очистить аккумулятор
; контрольной суммы
add al,[bx] ; прибавить текущее
; значение байта
inc bx ; ссылка на следующее
; значение
loop CheckSum
ret
CheckSum ENDP
Вы наверное согласитесь с выводом, что если подпрограмма на-
писана и отлажена (то есть правильно работает), то редко прихо-
дится снова просматривать ее текст. Все, что вам потребуется уз-
нать, - это какие функции выполняет подпрограмма, то есть, что
происходит, когда вы ее вызываете, и как подпрограмма взаимодейс-
твует с вызывающей ее программой. Этим целям довольно хорошо от-
вечает приведенный в примере описательный заголовок (который
иногда называют также "шапкой" программы).
Существует и много других методов комментирования, и вы, без
сомнения, придумаете такой метод, который больше подходит для ва-
шего стиля программирования. Важно только писать комментарии с
самого начала, благодаря чему комментирование станет со временем
неотъемлемой частью вашего стиля программирования.
Директивы определения сегментов
-----------------------------------------------------------------
И в данной главе, и в предыдущей, мы уже уделили много вре-
мени для пояснения того, что собой представляют директивы опреде-
ления сегментов и как они влияют на составляемую вами программу.
Однако, имеется еще один момент, которого мы пока не касались.
Суть его в следующем: откуда Турбо Ассемблер в точности знает, в
каком сегменте или сегментах находятся код и данные?
Управление сегментами - это один из наиболее сложных аспек-
тов программирования на языке Ассемблера для процессоров 8086. В
Турбо Ассемблере предусмотрен не один, а целых два набора дирек-
тив управления сегментами. Первый набор, состоящий из упрощенных
директив определения сегментов, делает управление сегментами от-
носительно легким и идеально подходит для компоновки модулей Ас-
семблера с языками высокого уровня, но поддерживает только неко-
торые из сегментных средств, имеющихся в Турбо Ассемблере.
Второй набор, состоящий из стандартных (полных) директив опреде-
ления сегментов, более сложно использовать, но он предусматрива-
ет полное управление сегментами, необходимое в некоторых прик-
ладных программах Ассемблера. Далее мы рассмотрим как
упрощенные, так и стандартные директивы определения сегментов.
Здесь же мы просто дадим обзор того, как можно использовать ди-
рективы определения сегментов для составления ваших программ (их
полное описание содержится в Главе 9 "Развитое программирование
на Турбо Ассемблере").
Упрощенные директивы определения сегментов
-----------------------------------------------------------------
Основными упрощенными директивами определения сегментов яв-
ляются директивы .STACK, .CODE, .DATA, .MODEL и DOSSEG. Рассмот-
рим эти директивы, разбив их на две группы. Первой будет группа
директив .STACK, .CODE и .DATA.
