Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 2

Основы программирования

59

nmb 2 dw птЪЗ dw nmb4 dw

В чем состоит различие двух последних описаний данных' Различие есть, и весьма существенное. Хотя в обоих случаях в память записывается натуральный ряд чисел от 0 до 4, однако в первом варианте под каждое число в памяти отводится один байт, а во втором — слово. Если мы в дальнейшем будем изменять значения элементов нашего массива, то в первом варианте каждому числу можно будет задавать значения от 0 до 255, а во втором — от 0 до 65535.

Выбирая для данных способ их описания, необходимо иметь в виду, что ассемблер выполняет проверку размеров используемых данных и не пропускает команды, в которых делается попытка обратиться к байтам, как к словам, или к словам — как к байтам. Рассмотрим последний вари­ант описания массива numbers. Хотя под каждый элемент выделено целое слово, однако реальные числа невелики и вполне поместятся в байт. Мо­жет возникнуть искушение поработать с ними, как с байтами, перенеся предварительно в байтовые регистры:

mov AL,nmbO mov DL,nmbl mov CL,nmb2

;Переносим nmbO в AL ;Переносим nmbl в AL ;Переносим nmb2 в AL

Так делать нельзя. Транслятор сообщит о грубой ошибке — несоответ­ствии типов, и не будет создавать объектный файл. Однако довольно час­то возникает реальная потребность в операциях такого рода. Для таких случаев предусмотрен специальный атрибутивный оператор byte ptr (byte pointer, байтовый указатель), с помощью которого можно на время вы­полнения одной команды изменить размер операнда:

П

mov AL,byte ptr nmbO \

mov DL,byte ptr nmbl ,ч

mov CL,byte ptr nmb2

Эти команды транслятор рассматривает, как правильные.

Часто возникает необходимость выполнить обратную операцию — к паре байтов обратиться, как к слову. Для этого надо использовать опера­тор word ptr:

okey db 'OK'

mov AX,word ptr okey

Здесь оба байта из байтовой переменной okey переносятся в регистр АХ. При этом первый по порядку байт, т.е. байт с меньшим адресом, со­держащий букву "О" (можно считать, что он является младшим в слове

"ОК"), отправится в младшую половину АХ — регистр AL, а второй по порядку байт, с буквой "К", займет регистр АН.

До сих пор речь шла о данных, которые, в сущности, являлись перемен­ными, в том смысле, что под них выделялась память и их можно было моди­фицировать. Язык ассемблера позволяет также использовать константы, ко­торые являются символическими обозначениями чисел и могут использо­ваться всюду в тексте программы, как наглядные эквиваленты этих чисел:

maxsize - OFFFFh mov CX,maxsize mov CX,OFFFFh

Последние две команды полностью эквивалентны.

При определении констант допустимо выполнение арифметических операций. Пусть нам надо задать позицию символа (или строки симво­лов) на экране. Учитывая, что каждый символ записывается в видеопа­мяти в двух байтах (в первом — код ASCII символа, а во втором — его атрибут), строка экрана имеет длину 80 символов, а высота экрана со­ставляет 25 строк, то для вывода некоторого символа в середину экрана его смещение в видеопамяти от начала видеостраницы можно определить следующим образом:

position=80*2*12+40*2

Такая запись достаточно наглядна, и ее легко модифицировать, если мы решим вывести символ в какую-то другую область экрана.

Константами удобно пользоваться для определения длины текстовых строк:

* mes db 'Ждите'

mes_len = S-mes

В этом примере константа mes_len получает значение длины строки mes (в данном случае 5 байт), которая вычисляется как разность значения счетчика текущего адреса после определения строки и ее начального ад­реса mes. Такой способ удобен тем, что при изменении содержимого стро­ки достаточно перетранслировать программу, и та же константа mes_len автоматически получит новое значение.