Теперь, когда вы поняли, почему язык Ассемблера является уникальным, можно заняться деталями программирования на Ассемблере.
В этой главе вы узнаете об основных компонентах программы на Ассемблере. Сначала мы расскажем о минимальных требованиях к работающей программе на Ассемблере. Затем мы обсудим различные элементы строки, и как их можно сочетать друг с другом. Попутно мы расскажем много полезного об инструкциях, директивах и тех способах, с помощью которых программа на Ассемблере может получить доступ к памяти. Вы увидите, как в Турбо Ассемблере определяются и используются сегменты, узнаете о выделении и использовании переменных в памяти. Наконец, мы рассмотрим некоторые наиболее общеупотребительные инструкции.
Объем охваченных здесь тем велик, но когда вы покончите с этой главой, вы узнаете достаточно, чтобы начать писать программы на Ассемблере. Реализовать это знание можно с помощью программы подсчета слов, приведенной в конце главы.
Так как в данной главе только затрагиваются многие аспекты программирования на Ассемблере, то в Главу 6 «Более подробно о программировании на Турбо Ассемблере» и Главу 9 «Развитое программирование на Турбо Ассемблере» где эти темы получают дальнейшее развитие.
Элементы и структура программы на языке Ассемблера
Теперь, когда вы лучше понимаете, что представляет собой программа на языке Ассемблера процессора 8086, вы готовы к тому, чтобы начать писать на Ассемблере программы. Давайте рассмотрим, каковы минимальные требования к работающей программе на Ассемблере. Даже простая программа на Ассемблере включает в себя некоторое количество строк. Рассмотрим, например, следующую программу:
DOSSEG ; директива упорядочивания
; сегментов
MODEL SMALL ; модели кода и данных
; ближнего типа
STACK 200h ; стек объемом 512 байт
DATA ; начало сегмента данных
DisplayString DB 13,10 ; пара символов «возврат
; каретки/перевод строки»
; для начала новой строки
ThreeChars DB 3 DUP (?) ; память для трех символов,
; введенных с клавиатуры
DB ‘$’ ; хвостовой символ «$»,
; указывающий DOS, где
; завершить вывод строки
; DisplayString при
; выполнении функции 9
CODE ; начало сегмента кода
Begin:
mov ax,@Data
mov ds,ax ; DS указывает на сегмент
; данных
mov bx,OFFSET ThreeChars ; указывает на
; ячейку памяти, где
; содержится первый символ
mov ah,1 ; функция DOS ввода с
; клавиатуры
int 21h ; получить следующую
; нажатую клавишу
dec al ; вычесть из символа 1
mov [bx],al ; сохранить измененный
; символ
inc bx ; указать на ячейку памяти,
; где содержится следующий
; символ
inc 21h ; получить следующую
; нажатую клавишу
dec al ; вычесть из символа 1
mov [bx],al ; сохранить измененный
; символ
inc bx ; ссылка на ячейку памяти
; со следующим символом
int 21h ; получить следующую
; нажатую клавишу
dec al ; вычесть из символа 1
mov [bx],al ; сохранить измененный
; символ
mov dx,OFFSET DisplayString ; ссылка на
; строку измененных
; символов
mov ah,9 ; функция DOS вывода строки
int 21h ; вывести измененные символы
mov ah,4ch ; функция DOS завершения
int 21h ; программы
END Begin ; директива, отмечающая
; конец исходного кода и
; указывающая, где начинать
; выполнение при запуске
; программы
Данная программа содержит упрощенные директивы определения сегментов DOSSEG, .MODEL, .STACK, .DATA и .CODE, а также директиву END. В каждой программе на Ассемблере, чтобы обеспечить определение сегментов и управление ими, необходимы директивы определения сегментов (упрощенные или стандартные), а завершать программу на Ассемблере всегда должна директива END. Директивы определения сегментов и директиву END, а также некоторые другие директивы мы опишем в данной главе.
Директивы представляют собой только «рамки» программы на Ассемблере. В самой программе необходимы также строки исходного кода, выполняющие какиелибо действия, например:
mov [bx],al
и
inc dx
Эти строки представляют собой мнемоники инструкций, соответствующие набору инструкций процессора 8086, список которых приведен в предыдущей главе. Однако, перед тем, как вы сможете использовать инструкции или директивы, вы должны изучить формат строки кода Ассемблера, так что давайте рассмотрим его.
Если вы захотите узнать, что же делает первая программа (приведенный в выше пример), введите ее, запустите, наберите IBM, после чего программа ответит вам:
HAL
Программа считывает три символа, вычитает из каждого символа значение 1 и выводит на экран результат.
