adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
В размещении каждой метки на своей собственной строке имеют-
ся два преимущества. Во-первых, когда вы размещаете каждую метку
на отдельной строке, легче использовать длинные метки без наруше-
ния структуры (формата) программы на Ассемблере, что сделало бы
ее менее читабельной. Во-вторых, справа от метки легче добавить
новую инструкцию, если метка не находится на той же строке, что и
инструкция. Чтобы преобразовать последний пример к виду:
.
.
jmp DoAddition
.
.
.
DoAddition: mov dx,[MemVar]
add ax,dx
.
.
.
вам пришлось бы разделить строку с меткой DoAddition и добавить
новый текст. Если же DoAddition находится на отдельной строке, вы
можете просто добавить после этой метки новую строку.
Метка не может совпадать с любым из используемых в выраже-
ниях встроенных символов, включая имена регистров (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.
Директива END
-----------------------------------------------------------------
Каждая программа должна содержать директиву END, отмечающую
конец исходного кода программы. Все строки, которые следуют за
директивой END, Турбо Ассемблером игнорируются. Если вы опустите
директиву END, то генерируется ошибка. Вы можете посчитать, что
концом программы является конец файла, но это не так: всегда тре-
буется указывать директиву END.
END является типичной директивой в том смысле, что она не
порождает никакого кода. Например:
DOSSEG
.MODEL SMALL
.STACK 200h
.DATA
ProgramStart:
mov ah,4ch
int 21h
END ProgramStart
Это, возможно, простейшая программа на Ассемблере. Она ниче-
го не делает, просто немедленно возвращает управление DOS. Обра-
тите внимание на использование директивы END для завершения кода,
из которого состоит данная программа.
Без сомнения вы заметили, что на одной строке с директивой
END содержится метка ProgramStart. Кроме завершения программы,
директива END может выполнять еще и вторую функцию, указывая, где
должно начинаться выполнение при запуске программы. По той или
иной причине вы можете не захотеть начать выполнение программы в
файле .EXE с первой инструкции. Директива END предусматривает та-
кие случаи. Предположим, например, вы запускаете программу, полу-
ченную в результате ассемблирования и компоновки следующего кода:
DOSSEG
|
adfun.ru
|
|
|
|