Счетчик адреса отслеживает при ассемблировании исходного файла текущий адрес. Это позволяет вам в любой момент в процессе ассемблирования программа знать, где вы находитесь. Турбо Ассемблер предоставляет директивы, которые позволяют работать со счетчиком адреса и помещать в него нужно значение адреса.
Метки представляют собой имена, использующиеся для ссылок на адреса в программе. Меткам во время их определения присваивается текущее значение счетчика адреса программы. Метки позволяют вам назначать имена переменным в памяти и адресам конкретных инструкций.
В данной главе описываются имеющиеся директивы, которые используются для работы со счетчиком адреса и описания метод по текущему адресу.
Идентификатор счетчика адреса $
Предопределенный идентификатор $ представляет текущий счетчик адреса. Счетчик адреса состоит из двух частей: сегмента и смещения. При ассемблировании счетчик адреса представляет собой смещение в текущем сегменте.
Счетчик адреса - это адрес адрес, который увеличивается и отражает текущий адрес при ассемблировании каждого оператора исходного файла. Например:
helpkMessage DB "это справочное сообщение программы" helpLength = $ - helpMessage
Когда эти две строки ассемблируются, идентификатор helpLength равен длине справочного сообщения.
Директивы счетчика адреса $
В Турбо Ассемблере предусмотрено несколько директив, устанавливающий счетчик инструкций. Эти директивы описываются в следующем разделе. Заметим, что все эти директивы работают как в режиме MASM, так и в режиме Ideal.
Директива ORG
Вы можете использовать директиву ORG, чтобы установить счетчик адреса в значение текущего сегмента. Директива ORG имеет следующий синтаксис:
ORG выражение
где "выражение" не может содержать никаких имен идентификаторов с опережающими ссылками. Оно может быть константой или смещением от идентификатора в текущем сегменте, либо смещением относительно текущего счетчика адреса.
Перед данными или кодом, которые уже введены в сегмент, вы можете восстановить значение счетчика адреса. Это можно использовать для возврата назад и заполнения записей таблицы, значения которых не были известны во время определения таблицы. Используйте этот метод с осторожностью: вы можете непреднамеренно что-либо затереть.
Директиву ORG можно использовать для того, чтобы связать метку с конкретным адресом. Директива ORG может также использоваться для задания начального адреса файлов .COM. Приведем примеры ее использования:
PROG SEGMENT ORG 100h ; начальное смещение файла .COM start: ; ; остальная часть программы .COM PROG ENDS end start
Приведем другой пример:
PROG SEGMENT ASSUME cs:PROG, ds:PROG, ss:PROG, es:NOTHING ORG 20h EnvPtr label word ; определить метку для доступа ; к слову в PSP, которое ука- ; зывает на сегмент, содержа- ; щий блок операционной среды ; (он обычно освобождается для ; создания более компактной ; резидентной программы) ORG 80h CmdLength lebel byte ; определить метку для доступа ; к длине командной строки
ORG @1h CmdLine label byte ; определить метку для доступа ; к тексту командной строки
ORG 0100h start:
; освободить блок операционной среды
mov es, EnvPtr ; ES -> блок операционной среды mov ah, 49h ; функция 49h: освободить блок ; памяти int 21h ; вызвать MS-DOS jc error_ENV ; ошибка освобождения EnvBlock?
; анализ командной строки
mov al, CmdLength ; длина командной строки or al,al ; проверка на 0 jz no_params ; нет параметров mov cl,al ; поместить длину в cl mov ch,0 mov si,offset CmdLine ; адрес командной строки mov al," " ; символ для поиска repne scasb ; поиск первого пробела ; ; остальная часть файла .COM резидентной программы: PROG ENDS end start
1 2 3
8 8 8
|