Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример программы

Определение процедур. Директива PROC

Директива ORG

Директива EQU

Директива EQU не определяет элемент данных, но определяет значение, которое может быть использовано для постановки в других командах. Предположим, что в сегменте данных закодирована следующая директива EQU:

TIMES EQU 10

Имя, в данном случае TIMES, может быть представлено любым допустимым в ассемблере именем. Теперь, в какой-бы команде или директиве не использовалось слово TIMES ассемблер подставит значение 10. Например, ассемблер преобразует директиву

Директива ORG используется для определения значения программного счетчика. Компилятор встретив эту директиву изменяет значение адресов по которым он размещает скомпилированные команды на указанное значение. Формат:

ORG выражение

Директиву ORG можно использовать для того, чтобы связать метку с конкретным адресом. Директива ORG может также использоваться для задания начального адреса размещения кода при компиляции в формат COM.

Процедуры в языке ассемблер определяются с помощью директивы PROC. Следует учитывать, что определение процедуры — это лишь указание компилятору. Фактически это только метка.

<имя-процедуры> PROC <параметр>

<тело процедуры>

<имя-процедуры> ENDP

Имя процедуры должно обязательно присутствовать. Параметр у директивы PROC может быть NEAR (близкий) и FAR (дальний). К близкой процедуре можно обращаться только из того сегмента команд, где она описана, и нельзя обращаться из других сегментов, а к дальней процедуре можно обращаться из любых сегментов команд. Имена и метки, описанные в процедуре, не локализуются внутри нее.

Обратиться к процедуре можно с помощью любой команды перехода.

Команда CALL осуществляет вызов процедуры (подпрограммы).

Команда RET осуществляет возврат из процедуры.

call имя_процедуры

Аналогично команде JMP передает управление по адресу, но при этом в стеке сохраняется адрес возврата (т. е. адрес команды, следующей после команды CALL). При внутрисегментном вызове процедура находится в текущем сегменте кода, и в качестве адреса возврата команда CALL сохраняет только содержимое регистра IP. При межсегментном вызове процедура находится в другом сегменте кода, и для осуществления возврата команда CALL должна запомнит содержимое обоих регистров CS и IP, при этом в стеке сначала запоминается содержимое регистра CS, затем - регистра IP. Одна и та же процедура не может быть одновременно процедурой ближнего и дальнего типов.

<1> data segment para public “data”;сегмент данных

<2> message db “Введите две 16-теричные цифры, $”

<3> data ends

<4> stk segment stack

<5> db 256 dup (“?”);сегмент стека

<6> stk ends

<7> code segment para public “code”;начало сегмента кода

<8> main proc;начало процедуры main

<9> assume cs:code,ds:data,ss:stk

<10> mov ax,data;адрес сегмента данных в регистр ах

<11> mov ds,ax;ax в ds

<12> mov ah,9

<13> mov dx,offset message

<14> int 21h

<15> xor ax,ax;очистить регистр ах

<16> mov ah,1h;1h в регистр ah

<17> int 21h;генерация прерывания с номером 21h

<18> mov dl,al;содержимое регистра al в регистр dl

<19> sub dl,30h;вычитание: (dl)=(dl)-30h

<20> cmp dl,9h;сравнить (dl) с 9h

<21> jle M1;перейти на метку М1, если dl<9h или dl=9h

<22> sub dl,7h;вычитание: (dl)=(dl)-7h

<23> M1:;определение метки М1

<24> mov cl,4h;пересылка 4h в регистр сl

<25> shl dl,cl;сдвиг содержимого dl на 4 разряда влево

<26> int 21h;вызов прерывания с номером 21h

<27> sub al,30h;вычитание: (dl)=(dl)-30h

<28> cmp al,9h;сравнить (al) c 9h

<29> jle M2;перейти на метку М2, если al<9h или al=9h

<30> sub al,7h;вычитание: (al)=(al)-7h

<31> M2:;определение метки М2

<32> add dl,al;сложение: (dl)=(dl)+(al)

<33> mov ax,4c00h;пересылка 4с00h в регистр ax

<34> int 21h;вызов прерывания с номером 21h

<35> main endp;конец процедуры main

<36> сode ends;конец сегмента кода

<37> end main;конец программы с точкой входа main

Строки 1-3 определяют сегмент данных. В строке 2 описана текстовая строка с сообщением «Введите две шестнадцатеричные цифры».

Строки 4-6 описывают сегмент стека, который является просто областью памяти длиной 256 байт, инициализированной символами «”?”». Отличие сегмента стека от сегментов других типов состоит в использовании и адресации памяти. В отличие от сегмента данных (наличие которого необязательно, если программа не работает с данными), сегмент стека желательно определять всегда.

Строки 7-36 содержат сегмент кода. В этом сегменте в строках 8-35 определена одна процедура main.

Строка 9 содержит директиву ассемблера, которая связывает сегментные регистры с именами сегментов.

Строки 10-11 выполняют инициализацию сегментного регистра DS.

Строки 12-14 выводят на экран сообщение message:

Строка 15 подготавливает регистр АХ к работе, обнуляя его.

Строки 16-17 обращаются к средствам операционной системы для ввода символа с клавиатуры. Введенный символ операционная система помещает в регистр AL.

Строка 18 пересылает содержимое AL в регистр DL. Это делается для того, чтобы освободить AL для ввода второй цифры.

Строка 19 преобразует символьную цифру 5 в ее двоичный эквивалент путем вычитания 30h, в результате чего в регистре DL будет двоичное значения числа 5.

В строках 20-21 выясняется, нужно ли корректировать двоичное значение DL. Если оно лежит в диапазоне 0…9, то в DL находится правильный двоичный эквивалент введенного символа шестнадцатеричной цифры. Если значение в DL больше 9, то введенная цифра является одним из символов A,B,C,D,E,F. В первом случае строка 21 передаст управление на метку М1. При обработке цифры 5 это условие как раз выполняется, поэтому происходит переход на метку М1(строка 23).

В строках 24-25 значение в DL сдвигается на 4 разряда влево, освобождая место в младшей тетраде под младшую шестнадцатеричную цифру.

В строке 26 в регистр AL вводится вторая шестнадцатеричная цифра С (ееASCII-код - 63h).

В строках 27-29 выясняется, попадает ли двоичный эквивалент второго символа шестнадцатеричной цифры в диапазон 0…9. Наша вторая цифра не попадает в диапазон, поэтому для получения правильного двоичного эквивалента нужно произвести дополнительную корректировку. Это делается в строке 38.

Строки 33-34 предназначены для завершения программы и возврата управления операционной системе.


<== предыдущая лекция | следующая лекция ==>
Директива определения двойного слова DD | Представление команд в памяти
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 263; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.019 сек.