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.