![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программирование на языке ассемблера
Язык ассемблера изоморфен машинному языку, т. е. каждому оператору языка ассемблера соответствует, как правило, одна команда процессора. Это позволяет воспользоваться всеми возможностями системы команд ЦП и АП. Практика показала, что язык ассемблера является основным языком программирования контроллеров. Для систем, построенных на основе центрального процессора ЦП и АП, используется язык ассемблера АSМ-86. Программирование ПВВ Intel 8089 осуществляется на языке ассемблера АSМ-89. Рассмотрим основные особенности этих языков. Программа на языке ассемблера составляется в виде последовательности операторов. Имеется два типа операторов: мнемокоды команд и директивы. Основное отличие директив и мнемокодов команд состоит в том, что в процессе ассемблирования директивы предоставляют программе-ассемблеру вспомогательную информацию, которая используется в процессе ассемблирования и служит для описания типов данных, резервирования памяти, определения сегментов, организаций процедур и т. п. Рассмотрим пример простой программы, блок-схема которой приведена на рис. 6.1. Эта программа суммирует числа, поступающие из порта ввода-вывода port1, в ячейке sum до тех пор, пока накопленное значение sum< 100, после чего выводит накопленное значение в port1. Ниже представлен полный текст программы на языке ASM-86 (нумерация строк введена исключительно для дальнейшего пояснения программы):
1 data SEGMENT; начало сегмента данных 2 sum DB?; резервирование байта 3 data ENDS; конец сегмента данных
4 code SEGMENT; начало программного сегмента 5 ASSUME cs: code,; code – имя программного сегмента ds: data; data – имя сегмента данных 6 port1 EQU 110h; port1 – константа 110h 7 Go: mov ax, data 8 mov ds, ax 9 mov sum, 0 10 Comp: cmp sum, 100 11 jl Next 12 mov al, sum 13 out port1, al 14 hlt 15 Next: in al, port1 16 add sum, al 17 jmp Comp 18 code ENDS; конец программного сегмента 19 END Go; конец ассемблирования
Программа состоит из двух сегментов: сегмента данных (строки 1-3) и программного сегмента (строки 4-18). Для определения начала каждого из этих сегментов служит директива SEGMENT, перед которой указано имя сегмента. В строке 1 определяется начало сегмента данных с именем data, а в строке 4 - начало программного сегмента с именем code. Конец каждого сегмента указывается с помощью директивы ENDS (строки 3 и 18), перед которой записывается имя соответствующего сегмента. Сегмент данных состоит из одной строки (строка 2), содержащей директиву DB - определение байта памяти. По этой директиве программа ассемблера резервирует под переменную с именем sum - 1 байт памяти. Директива ASSUME (строка 5) определяет соответствие сегментов и их имен. В строке 6 записана директива EDU, которая порту ввода-вывода port1 ставит в соответствие его номер. В дальнейшем, когда в тексте программы встретится имя port1, программа-ассемблер заменит его на номер 110h.
Рис. 6.1. Блок-схема программы
Строка 7 - это первая строка программы, которая содержит мнемокод команды, т. е. первая команда результирующей программы будет получена при ассемблировании данной строки. Одно из требований к программам, написанным на языке АSМ-86, состоит в том, что первая строка программы, содержащая мнемокод команды, должна иметь метку. В данной программе имя метки Gо. Строки 7 и 8 служат для занесения начального адреса сегмента данных в регистр сегмента данных DS. Поскольку система команд ЦП не содержит команды загрузки константы в сегментный регистр, для этой цели используются две команды. В строке 9 переменной sum присваивается нулевое начальное значение и далее, в строке 10 производится сравнение значения sum со значением 100. В зависимости от результатов сравнения в строке 11 осуществляется переход по условию «меньше» на метку Next. В строках 12 - 14 полученное значение sum выводится в порт ввода-вывода, а в строках 15 - 17 осуществляется суммирование очередного введенного числа и переход на метку Comp в соответствии со схемой программы (рис. 6.1). Строка 18 завершает программный сегмент, а строка 19 содержит директиву END, которая указывает программе-ассемблеру на окончание ассемблирования и снабжается меткой, соответствующей началу программы. Рассмотренный пример позволяет установить две основные особенности программ на языке ASM-86. Первая состоит в сегментации программ, в результате чего они в общем случае получают следующую структуру:
имя1 SEGMENT оператор оператор ... имя1 ENDS имя2 SEGMENT оператор оператор ... имя2 ENDS ... имя3 SEGMENT оператор оператор ... имя3 ENDS END метка начала
Вторая особенность состоит в том, что два типа операторов (директивы и мнемокоды команд) имеют идентичные форматы (рис. 6.2). Оператор, написанный на языке ассемблера, может быть разделен на четыре поля.
Рис. 6.2. Поля операторов языка ASM-86: а - директив; б - мнемокодов команд
Каждый оператор записывается с новой строки и между полями ставится один или несколько пробелов. Как видно из приведенного выше примера программы, не все поля могут быть заполнены. В любом операторе обязательно заполнено поле операции директивой или мнемокодом команды.
|