Программирование на языке ассемблера


Язык ассемблера изоморфен машинному языку, т. е. каждому оператору языка ассемблера соответствует, как правило, одна команда процессора. Это позволяет воспользоваться всеми возможностями системы команд ЦП и АП. Практика показала, что язык ассемблера является основным языком программирования контроллеров. Для систем, построенных на основе центрального процессора ЦП и АП, используется язык ассемблера А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: а - директив; б - мнемокодов команд

 

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

 



Дата добавления: 2018-11-26; просмотров: 823;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.013 сек.