 |
сором 8086. Если регистр BX содержит значение 25, а SI содержит
52, то при выполнении инструкции MOV CL записывается по адресу
памяти 25 + 52 + 111 = 188. Ключевой момент состоит в том, что
базовый регистр, индексный регистр и смещение складываются вместе
процессором 8086 при выполнении инструкции. Таким образом, Турбо
Ассемблер складывает константы во время ассемблирования, а про-
цессор 8086 складывает содержимое базового регистра, индексного
регистра и смещения во время действительного выполнения инструк-
ции.
Как вы можете заметить, ни в одном из примеров мы не исполь-
зовали регистр BP. Это связано с тем, что поведение регистра BP
несколько отличается от регистра BX. Вспомните, что в то время
как регистр BX используется, как смещение внутри сегмента данных,
регистр BP используется, как смещение в сегменте стека. Это озна-
чает, что регистр BP не может обычно использоваться для адресации
к строке CharString, которая находится в сегменте данных.
Пояснение использования регистра BP для адресации к сегменту
стека приводится в Главе 4. В данный момент достаточно знать, что
регистр BP можно использовать так же, как мы использовали в при-
мерах регистр BX, только адресуемые данные должны в этом случае
находиться в стеке.
(На самом деле регистр BP можно использовать и для адресации
к сегменту данных, а BX, SI и DI - для адресации к сегменту сте-
ка, дополнительному сегменту или сегменту кода. Для этого исполь-
зуются префиксы переопределения сегментов (segment override pre-
fixes). О некоторых из них мы расскажем в Главе 10. Однако в
большинстве случаев они вам не понадобятся, поэтому пока мы прос-
то забудем об их существовании.)
Наконец, квадратные скобки, в которые заключаются непос-
редственные адреса, являются необязательными. То есть инструкции:
mov al,[MemVar]
и
mov al,MemVar
выполняют одни и те же действия. Тем не менее мы настоятельно ре-
комендуем вам заключать все ссылки на память в квадратные скобки.
Это поможет избежать путаницы и сделает вашу программу более яс-
ной и понятной. Несомненно, вы столкнетесь с программами, в кото-
рых квадратные скобки отсутствуют, так как некоторые все же счи-
тают, что в таком виде программа воспринимается лучше. Это, в об-
щем, дело вкуса, но если вы выберете стиль адресации по одной
ячейке памяти и будете содержательно его использовать, вам будет
легче писать программы.
Вы можете использовать также такую форму адресации к памяти:
mov al,CharString[bx]
или даже
mov al,CharString[bx][si]+1
Все эти формы представляют собой то же самое, что размещение
отдельных элементов адресации к памяти в одной паре квадратных
скобок и разделение их знаком плюс. Таким образом, последний опе-
ратор эквивалентен оператору:
mov al,[charString+bx+si+1]
Здесь снова нужно выбрать ту форму записи, которая вам боль-
ше нравится, и придерживаться ее.
Квадратные скобки, в которые заключаются регистры, указываю-
щие на ячейки памяти, являются обязательными. Без этих скобок,
BX, например, интерпретируется, как операнд, а не как ссылка на
операнд.
Комментарии
-----------------------------------------------------------------
Расскажем наконец, что представляет собой поле комментария.
Комментарии не выполняют никаких реальных действий в том смысле,
что они не влияют на код выполняемого Турбо Ассемблером файла. Но
это не означает, что они не являются существенными.
Вероятно, вы уже знаете, как программировать на языке высо-
кого уровня (Си, Паскале, Прологе или другом), поскольку очень
немногие начинают свое знакомство с программированием с Ассембле-
ра. По мере знакомства с этим языком вы будете вновь и вновь
встречаться с советами и рекомендациями по необходимости акку-
ратной записи комментариев. Это прекрасный совет, так как и слож-
ность, и время, прошедшее с момента ее написания, могут сделать
программу совершенно непонятной даже для ее автора.
По сравнению с языком Ассемблера программа, например, на
Паскале гораздо более наглядна. Программы Паскаля хорошо структу-
рированы, он имеет жестко типизованные переменные, арифметические
выражения, вызовы процедур и функций с формальными и фактическими
параметрами.
Ассемблер же не имеет встроенных управляющих структур, жест-
кой принудительной типизации данных, включающих переменные ариф-
метических выражений и присущего ему механизма передачи парамет-
ров. Короче говоря, код Ассемблера - это не тот хорошо структури-
рованный и легко обслуживаемый текст, к которым вы, возможно,
встречались. Поэтому, чтобы поднять Ассемблер до уровня естест-
венного кодирования, вы должны широко пользоваться комментариями,
а также подпрограммами и макрокомандами.
Имеется много способов включения в код Ассемблера коммента-
риев. Один из наиболее полезных подходов состоит в том, чтобы
слева от каждой инструкции помещать комментарий, в котором содер-
жится ее краткое пояснение. Например, инструкция:
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К и не должен
; пересекать границу сегментов.
;
|