Метка не может совпадать с любым из используемых в выражениях встроенных символов, включая имена регистров (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.
