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

Глава 2

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

57-

Сегмент данных начинается с данного по имени counter, которое опи­сано, как слово.(2 байт) и содержит число 10000. Очевидно, что его сме­щение равно 0. Поскольку это данное занимает 2 байт, следующее за ним данное pages получило смещение "2. Данное pages описывает строку текста длиной 10 символов и занимает в памяти столько же байтов, поэтому следующее данное numbers получило относительный адрес 2 + 10 = 12 = Ch. В поле numbers записаны 5 байтовых чисел, поэтому последнее данное сегмента с именем page_addr размещается по адресу СИ + 5 = 1 111.

Ассемблер, начиная трансляцию сегмента (в данном случае сегмента данных) начинает отсчет его относительных адресов. Этот отсчет ведется в специальной переменной транслятора (не программы!), которая назы­ вается счетчиком текущего адреса и имеет символическое обозначение знака доллара (S). По мере обработки полей данных, их символические имена сохраняются в создаваемой ассемблером таблице имен вместе с соответствующими им значениями счетчика текущего адреса. Другими словами, введенные нами символические имена получают значения, рав­ ные их смещениям. Таким образом, с точки зрения транслятора counter равно 0, pages — 2, numbers — Ch и т.д. Поэтому предложение ft-

(•

page_addr dw pages

м

трактуется ассемблером, как , t

page_addr dw 2

и приводит к записи в слово с относительным адресом ПИ числа 2 (сме* щения строки pages). _ *

Приведенные рассуждения приходится использовать при обращении к «внутренностям» объявленных данных. Пусть, например, мы хотим вы­водить на экран строки «Страница 2», «Страница 3»,»Страница 4" и т.д. Можно, конечно, все эти строки описать в сегменте данных по отдельно­сти, но это приведет к напрасному расходу памяти. Экономнее поступить по-другому: выводить на экран одну и ту же строку pages, но модифици­ровать в ней номер страницы. Модификацию номера можно выполнить с помощью, например, такой команды:

mov pages+9, '2'

Здесь мы «вручную» определили смещение интересующего нас сим­вола в строке, зная, что все данные размещаются ассемблером друг за другом в порядке их объявления в программе. При этом, какое бы значе­ние не получило имя pages, выражение pages + 9 всегда будет соответ­ствовать байту с номером страницы.

Таким же приемом можно воспользоваться при обращении к данному numbers, которое в сущности предсташыет собой небольшой массив из 5 чисел. Адрес первого числа в этом массиве равен просто numbers, адрес второго числа — numbers + 1, адрес третьего — numbers + 2 и т.д. Следую­щая команда прочитает последний элемент этого массива в регистр DL:

mov DL,numbers+4

Какой смысл имело объединение ряда чисел в массив numbers' Да никакого, если к этим числам мы все равно обращаемся по отдельности. Удобнее было объявить этот массив таким образом:

nmbO db

nmbl db

nmb2 db

шпЬЗ db

nmb4 db

В этом случае для обращения к последнему элементу не надо вычис­лять его адрес, а можно воспользоваться именем шпЬ4. Если, с другой стороны, мы хотим работать с числами, как с массивом, используя ин­дексы отдельных элементов (о чем речь будет идти позже), то присвоение массиву общего имени представляется естественным. Получение после­днего элемента массива по его индексу выполняется с помощью такой последовательности команд:

mov mov

SI,4 ;Индекс элемента в массиве

ОЬ,питЬег8[51];Обращение по адресу

;numbers + содержимое SI

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

db db db

numbers label byte nmbO db 0 nmbl db nmb 2 nmb3

nmb4

Метка numbers должна быть объяшгена в данном случае с описателем byte, так как данные, следующие за этой меткой, описаны, как байты и мы планируем работать с ними именно как с байтами. Если нам нужно иметь массив слов, то отдельные элементы массива следует объявить с помощью директивы dw, а метке numbers придать описатель word:

numbers label word iimbO dw 0 nmbl dw 1