Метки


Метка не может совпадать с любым из используемых в выражениях встроенных символов, включая имена регистров (AX, BX и т.д.) и операторы, используемые в выражениях (PTR, BYTE, WORD и т.д.). В качестве меток нельзя также использовать любую из директив IFxxx или .ERRxxx. Несколько других зарезервированных в Турбо Ассемблере идентификаторов могут использоваться только в определенных контекстах. Эти идентификаторы включают в себя NAME, INCLUDE и COMMENT. Данные имена могут использоваться, как имена элементов структур, но не в качестве общих идентификаторов (более подробно о структурах рассказывается в Главе 9).

Лучший подход это избежать необходимости использования в качестве меток любого из встроенных имен идентификаторов. Например, метки:

bx DW 0 PTR:

были бы неприемлемы, так как BX это регистр, а PTR операция в выражении. Однако метка:

Old_BX DW 0

вполне допустима.

Приведем еще примеры допустимых меток:

MainLoop

calc_long_sum

Error0

Iterate

Draw$Dot

Delay_100_milliseconds

Метки в коде программы (и содержащиеся на отдельной строке, и после которых на той же строке следуют директивы или инструкции) должны заканчиваться двоеточием (:). Двоеточие просто завершает метку и не является ее частью. Например, в следующем фрагменте программы:

LoopTop:

mov al,[si]

inc si

and al,al

jz Done

jmp LoopTop

Done: ret

метки LoopTop и Done определены с двоеточиями, но в ссылках на эти метки двоеточия не указываются.

Другие метки в общем случае не должны завершаться двоеточием. В примере программы в начале данного раздела содержатся несколько меток без двоеточий.

Имена меткам следует назначать так, чтобы они имели смысл.

Сравните:

cmp al,’a’

jb NotALowerCaseLetter ; не строчная буква

cmp al,’z’

ja NotALowerCaseLetter

sub al,20h ; преобразовать в верхний

; регистр (прописную

; букву)

NotALowerCaseLetter:

и следующий фрагмент программы:

cmp al,’a’

jb P1

cmp al,’z’

ja P1

sub al,20h ; преобразовать в верхний

; регистр

P1:

Вариант с описательной меткой (особенно для владеющих английским языком, для русскоязычных программистов, возможно, лучше использовать варианты типа Ne_strochnaja_bukva) гораздо более понятен, в то время как второй с первого взгляда, мягко говоря, загадочен. Метки могут содержать символы подчеркивания. В зависимости от вашего предпочтения можно использовать метки типа not_a_ lower_case_ letter или Not _A_Lower_Case_Letter.

Мнемоники инструкций и директивы

Основным полем в строке программы на Ассемблере является поле <инструкция/директива>. Это поле может содержать мнемонику инструкции или директиву (две совершенно различные вещи).

Ранее в данной главе вы уже встречали мнемоники инструкций. Они представляют собой удобные для чтений имена инструкций, непосредственно выполняемых процессором 8086. MOV, ADD, MUL и JMP все это мнемоники инструкций, соответствующие инструкциям процессора 8086 перемещения данных, сложения, умножения и перехода соответственно.

Турбо Ассемблер ассемблирует каждую мнемонику инструкции непосредственно в соответствующую инструкцию на машинном языке. Каждый раз, когда вы включаете в программу на языке Ассемблера одну мнемонику инструкции, результатом является одна инструкция в выполняемом коде.

В отличие от мнемоник инструкций, директивы совсем не генерируют выполняемого кода. Вместо этого они управляют различными аспектами работы Турбо Ассемблера от типа ассемблируемого кода (процессоры 8086, 80286, 80386 и т.д.) до используемых сегментов и формата создаваемых файлов листингов. Хотя это не единственное отличие, вы можете рассматривать мнемоники инструкций, как генерирующие реальную программу на машинном языке процессора 8086, а директивы как ответственные за обеспечение средств высокого уровня Турбо Ассемблера, которые облегчают программирование на Ассемблере.

В данном руководстве мы уделяем большое внимание различным аспектам мнемоник и директив Турбо Ассемблера, которые обсуждаются также в Главе 3 «Справочного руководства». Имеется несколько директив, которые необходимы в любой программе на Ассемблере (в особенности это касается директив определения сегментов, которые мы обсудим несколько позднее). Другая директива, которая всегда необходима в программе это директива END.

Загрузка...