Главная   Добавить в избранное Программирование контроллера приоритетных прерываний | методичка


Бесплатные Рефераты, дипломные работы, курсовые работы, доклады - скачать бесплатно Бесплатные Рефераты, дипломные работы, курсовые работы, доклады и т.п - скачать бесплатно.
 Поиск: 


Категории работ:
Рефераты
Дипломные работы
Курсовые работы
Контрольные работы
Доклады
Практические работы
Шпаргалки
Аттестационные работы
Отчеты по практике
Научные работы
Авторефераты
Учебные пособия
Статьи
Книги
Тесты
Лекции
Творческие работы
Презентации
Биографии
Монографии
Методички
Курсы лекций
Лабораторные работы
Задачи
Бизнес Планы
Диссертации
Разработки уроков
Конспекты уроков
Магистерские работы
Конспекты произведений
Анализы учебных пособий
Краткие изложения
Материалы конференций
Сочинения
Эссе
Анализы книг
Топики
Тезисы
Истории болезней


 





Программирование контроллера приоритетных прерываний - методичка


Категория: Методички
Рубрика: Программирование, компьютеры и кибернетика, ИТ технологии
Размер файла: 108 Kb
Количество загрузок:
43
Количество просмотров:
2677
Описание работы: методичка на тему Программирование контроллера приоритетных прерываний
Подробнее о работе: Читать или Скачать
Смотреть
Скачать



Министерство образования Российской Федерации

Волжский университет им. Татищева

Факультет «Информатика и телекоммуникации»

Кафедра «Информатика и системы управления»

УТВЕРЖДАЮ

Проректор по учебной работе

_____________Е.В. Филатова

«_____»____________ 200 г.

МЕТОДИЧЕСКОЕ УКАЗАНИЕ

для проведения лабораторной работы по теме

Программирование контроллера приоритетных прерываний

по курсу Организация ЭВМ

для студентов специальностей 220100, 071900

Тольятти

Создание и компиляция программ на ассемблере

Процесс разработки программы на ассемблере состоит из пяти этапов:

1. Создание файла с исходным текстом программы в любом текстовом редакторе. Расширение файла с исходным текстом может быть .asm, или .txt, или .doc.

2. Создание объектного модуля. В среде DOS или NORTON или FAR в командной строке набираете следующую команду:

tasm name.asm

или

tasm.exe name.asm name.obj

name.asm файл с исходным текстом программы. При этом файлы tasm.exe и name.asm должны находится в одном каталоге. После запуска этой команды мы получаем объектный файл с расширением .obj. Если объектный файл не появился, то в программе содержатся ошибки. Перечень ошибок можно посмотреть, отключив панели (ctrl+o или Ctrl+f1 и ctrl+f2).

3. Создание исполнительного файла. В командной строке набираем следующую команду:

tlink name.obj

или

tlink.exe name.obj name exe

При этом файлы tlink.exe и name.obj должны находится в одном каталоге. После запуска этой команды мы получаем запускной файл с расширением .exe. Если запускной файл не появился в этом каталоге, то в данном каталоге не хватает некоторых библиотек. Перечень файлов можно посмотреть, отключив панели (ctrl+o или Ctrl+f1 и ctrl+f2).

4. Тестирование программы. Запустите исполнительный файл.

5. Пошаговая отладка. В командной строке набираем следующую команду:

td name.exe

Структура программы на ассемблере

Model small ;модель программы, или же количество памяти на сегмент

.data ;сегмент данных

;описание переменных

.stack 100h ;сегмент стека

.code ;сегмент данных

;процедуры, макрокоманды

main:

mov ax,@data

mov ds,ax

;основная программа

mov ax,4c00h

int 21h ;выход из программы

end main

Директивы резервирования памяти

Для описания простых типов данных в программе используются специальные директивы резервирования и инициализации данных, которые, по сути, являются указаниями транслятору на выделение определенного объема памяти. Если проводить аналогию с языками высокого уровня, то директивы резервирования и инициализации данных являются определениями переменных.

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

Директивы резервирования и инициализации данных простых типов имеют формат:

Рис. 1. Директивы описания данных простых типов

На рис. 1 использованы следующие обозначения:

· ? показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная;

· значение инициализации -- значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных. Подробная информация приведена в приложении 1;

· выражение -- итеративная конструкция с синтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторить последовательное занесение в физическую память выражения в скобках n раз.

· имя -- некоторое символическое имя метки или ячейки памяти в сегменте данных, используемое в программе.

· db -- резервирование памяти для данных размером 1 байт. Директивой db можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком -128...+127; для чисел без знака 0...255;

o символьную строку из одного или более символов. Строка заключается в кавычки. В этом случае определяется столько байт, сколько символов в строке.

· dw -- резервирование памяти для данных размером 2 байта.

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком -32 768...32 767; для чисел без знака 0...65 535;

o выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;

o 1- или 2-байтовую строку, заключенная в кавычки.

· dd -- резервирование памяти для данных размером 4 байта.

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком -2 147 483 648...+2 147 483 647;

для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;

o строку длиной до 4 символов, заключенную в кавычки.

· df -- резервирование памяти для данных размером 6 байт;

· dp -- резервирование памяти для данных размером 6 байт. Директивами df и dp можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком -2 147 483 648...+2 147 483 647;

для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o строку длиной до 6 байт, заключенную в кавычки.

· dq -- резервирование памяти для данных размером 8 байт.

относительное или адресное выражение, состоящее из 32 или менее бит

o константу со знаком из диапазона -263...263-1;

o константу без знака из диапазона 0...264-1;

o строку длиной до 8 байт, заключенную в кавычки.

· dt -- резервирование памяти для данных размером 10 байт.

относительное или адресное выражение, состоящее из 32 или менее бит

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o константу со знаком из диапазона -279...279-1;

o константу без знака из диапазона 0...280-1;

o строку длиной до 10 байт, заключенную в кавычки;

o упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.

Очень важно уяснить себе порядок размещения данных в памяти. Он напрямую связан с логикой работы микропроцессора с данными. Микропроцессоры Intel требуют следования данных в памяти по принципу: младший байт по младшему адресу.

Для иллюстрации данного принципа рассмотрим пример 1, в котором определим сегмент данных. В этом сегменте данных приведено несколько директив описания простых типов данных.

Пример 1. Пример использования директив резервирования и инициализации данных. Результатом работы данной программы будет строка Привет, все работает

model small

.stack 100h

.data

mes db Привет, все работает,$ ;определение строки

perem_1 db 0ffh ;определение контстанты

perem_2 dw 3a7fh ;определение контстанты

perem_3 dd 0f54d567ah ;определение контстанты

mas db 10 dup ( ) ;определение пустого массива из 10 байт

adr dw perem_3 ;переменная adr содержит адрес

;внутри сегмента переменной perem_3

a_full dd perem_3 ;переменная a_full содержит полный

;адрес переменной perem_3

fin db Конец сегмента данных программы $

.code

start:

;занесение в сегментный регистр адреса сегмента данных

mov ax,@data

mov ds,ax

mov ah,09h

mov dx,offset mes

int 21h ;вывод на экран строки mes

mov ax,4c00h

int 21h ;выход из программы

end start

Окончание работы программы сопровождается полной выгрузкой программы из оперативной памяти, это осуществляется функцией 4с00h прерывания int 21h.

Все что в данной программе выделено жирным шрифтом обязательно при написании любой программы.

При написании программ на ассемблере регистр букв не важен.

Организация ввода-вывода на ассемблере

Ввод-вывод данных в компьютер осуществляется посредством различных периферийных устройств. Общение процессора с различными периферийными происходит через систему прерываний. Для ввода-вывода данных служит прерывание int 21h.

Основная последовательность дей-ствий при использовании прерываний 2lh (DOS):

1. Поместить номер функции в регистр ah.

2. Поместить передаваемые функции параметры в определенные регистры (они приведены при описании каждой функции).

3. Вызвать прерывание 2lh (DOS) командой int 21h

4. Извлечь результаты работы функций из определенных регистров. Какие именно регистры и что они содержат после возврата управления из функ-ции программе пользователя, указывается при описании каждой функции.

Прерывание DOS 2lh предназначено для предоставления программисту раз-личных услуг со стороны операционной системы. Этими услугами является набор функций. Какая именно функция должна быть вызвана, указывается числом в регистре ah.

Некоторые функции DOS (int 21h)

Назначение

Номер функции

Вход

Выход

Ввод символа с ожиданием и эхосопровождением

ah-0lh

аl- ASCII-код символа

Вывод символа

ah-02h

dl- ASCII-код символа

Вывод символа на принтер

ah-05h

dl- ASCII-код символа

Ввод символа с ожиданием и без эхосопровождения

ah-07h

ah-08h

al- ASCII-код символа (функция 08h при вводе проверяет, не нажато ли CTRL-BREAK)

Вывод строки на экран

ah-09h

ds:dx = адрес строки с символом <$> на конце

Введенная строка в буфере

Ввод строки с клавиатуры

ah-0ah

ds:dx-anpec буфера с форматом:

1 байт -- размер буфера для ввода (формирует пользователь);

2 байт -- число фактически введенных символов (заполняет система по окончанию ввода -- нажатию клавиши Enter (Odh)). Символ 0dh не учитывается во втором байте буфера;

3 байт и далее -- введенная строка с символом 0dh на конце

Проверка состояния буфера клавиатуры

ah - 0bh

al=0 -- буфер пуст

al = 0ffh - в буфере есть символы

Пример 2. Программа ввода символа с клавиатуры

model small

.stack 100h

.data

.code

start: ;занесение в сегментный регистр адреса сегмента данных

mov ax, @data

mov ds, ax

;помещаем в регистр ah номер функции, которая вводит символ

mov ah, 01h

int 21h ;вводим символ с клавиатуры

;символ введенный с клавиатуры находится в регистре al

mov ax,4c00h

int 21h ;выход из программы

end start

Пример 3. Программа вывода символа на экран

model small

.stack 100h

.data

f db ф ;помещаем в переменную f выводимый символ

.code

start: ;занесение в сегментный регистр адреса сегмента данных

mov ax, @data

mov ds, ax

;помещаем в регистр ah номер функции, которая выводит символ

mov ah, 02h

mov dl, f ; помещаем в dl символ

int 21h ;выводим символ на экран

mov ax,4c00h

int 21h ;выход из программы

end start

Пример 4. Вывод строки на экран

model small

.stack 100h

.data

f db строка вывода$

;f - строковая переменная, которая обязательно заканчивается знаком $

.code

start: ;занесение в сегментный регистр адреса сегмента данных

mov ax, @data

mov ds, ax

;помещаем в регистр ah номер функции, которая выводит строку на экран

mov ah, 09h

mov dx, offset f ; помещаем в dx адрес строки, которую выводим

int 21h ;выводим строку

mov ax,4c00h

int 21h ;выход из программы

end start

Организация вычислений

Логические команды

Система команд микропроцессора содержит пять логических команд. Эти команды выполняют логические операции над битами операндов. Размерность операндов должна быть одинакова. В качестве операндов могут использоваться, регистры, ячейки памяти (переменные) и непосредственные операнды (числа). Любая логическая команда меняет значение следующих флагов of, sf,zf,pf,cf (переполнение, знак, нуля, паритет, перенос)

and операнд_1,операнд_2 -- операция логического умножения (И - конъюнкция).

and ah, 0a1h; ah:=ah?0ah

and bx, cx; bx:=bx?cx

and dx, x1; dx:=dx?x1

Команда and может применяться для сброса определенных битов в 0 или для определения значения некоторых битов.

Например, необходимо 5й бит числа находящегося в bl установить в 0, остальные биты не трогать.

and bl, 11011111b или and bl, 0cfh

Если необходимо определить чему равен 5й бит, то

and bl, 00100000b или and bl, 20h

В результате если в регистре bl в 5м бите был 0, то после выполнения этой команды мы получим нулевой результат, обнулим весь регистр. Если же в регистре bl в 5м бите была 1, то мы получим не нулевой результат.

or операнд_1,операнд_2 -- операция логического сложения (ИЛИ - дизъюнкцию)

or al, x1; al:=al & x1

or eax,edx; eax:=eax & edx

or dx, 0fa11h; dx:=dx & 0fa11h

Команда or может применяться для установки определенных бит в 1. Например, необходимо установить в единицу 4й и 7й биты регистра ah.

or ah, 10010000b или or ah, 90h

xor операнд_1,операнд_2 -- операция логического исключающего сложения (исключающего ИЛИ ИЛИ-НЕ). Команда может применятся для выяснения того какие биты в операндах различаются ил для инвертирования состояния заданных бит в операнде_1. Например, необходимо определить совпадает ли содержимое регистров ax и dx

xor ax, dx ;если содержимое совпадает то в регистре ах мы получим

;нулевой результат, иначе не нулевой результат.

xor bh,10b ; инвертировали 1й бит в регистре bh

test операнд_1,операнд_2 -- операция “проверить” (способом логического умножения). Команда выполняет поразрядно логическую операцию И над битами операндов операнд_1 и операнд_2. Состояние операндов остается прежним, изменяются только флаги zf, sf, и pf, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния.

not операнд -- операция логического отрицания. Команда выполняет поразрядное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.

not ax ;ax:=

Пример 5. Логическое сложение двух однобайтных чисел.

model small

.stack 100h

.data

x1 db 0c2h ;первое слагаемое

x2 db 022h ;второе слагаемое

y db ? ;переменная результата

.code

start:

mov ax,@data

mov ds,ax

mov al, x1 ;в al помещаем первое слагаемое

or al, x2 ;осуществляем логическое сложение, результат в al

mov y, al ;помещаем результат на место

mov ax,4c00h

int 21h

end start

Следующие две команды позволяют осуществить поиск первого установленного в 1 бита операнда. Они появились в 486 процессоре.

bsf операнд_1, операнд_2 - сканирование бит операнда_2 от младшего к старшему в поисках первого бита установленного в 1. Если такой обнаружится, то в операнд_1 заноситься номер этого бита в целочисленном формате.

Пример:

mov al,02h

bsf bx,al ; bx:=1, т.к. 1й бит регистра al=1

bsr операнд_1, операнд_2 - сканирование бит операнда_2 от старшего к младшему в поисках первого бита установленного в 1. Если такой обнаружится, то в операнд_1 заноситься номер этого бита в целочисленном формате.

Пример:

mov al,82h

bsr bx,al ; bx:=6, т.к. 6й бит регистра al=1

Если операнд_2 равен 0 то вышеописанные две команды устанавливают флаг нуля zf в 1, иначе в 0.

Арифметические операции над целыми двоичными числами

Сложение двоичных чисел
inc операнд - операция инкремента, то есть увеличения значения операнда на 1;
inc ax; ax:=ax+1
inc x1; х1:=х1+1
add оп1,оп2 - команда сложения с принципом действия: оп1 = оп1 + оп2 (addition)
add al, bl
add ax, 0fe2h
add ebx, x1+2
add x1, 0fh
add x2, ax
adc оп1,оп2 - команда сложения с учетом флага переноса cf. оп1 = оп1 + оп2 + знач_cf
Вычитание двоичных чисел
dec операнд -- операция декремента, то есть уменьшения значения операнда на 1;
dec cx ;cx:=cx-1
dec x
sub операнд_1,операнд_2 -- команда вычитания; ее принцип действия:
операнд_1 = операнд_1 - операнд_2
sub al, bl; al:=al-bl
sub ax, x1
sub x2, dx
sub eax, 0f35h
sub x2, 22h
sbb операнд_1,операнд_2 -- команда вычитания с учетом заема (флага cf ):
операнд_1 = операнд_1 - операнд_2 - значение_cf

Пример 6. Сложение двух однобайтных чисел.

model small

.stack 100h

.data

x1 db 0c2h ;первое слагаемое

x2 db 022h ;второе слагаемое

y db ? ;результат

.code

start:

mov ax,@data

mov ds,ax

mov al, x1 ;помещаем в al первое слагаемое

add al, x2 ;складываем х1 и х2

mov y, al ;помещаем результат на место

mov ax,4c00h

int 21h

end start

Умножение двоичных чисел

mul множитель_1 - операция умножения двух целых чисел без учета знака

Алгоритм работы:

Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя. Местоположение результата также зависит от размера первого сомножителя.

mul dl; ax:=al*dl, dl- множитель_1 , al- множитель_2

mul x1; dx:ax=ax*0ad91h, x1 word- множитель_1 , ax- множитель_2

mul ecx; edx:eax=eax*ecx, ecx- множитель_1 , eax- множитель_2

в результате умножения может возникнуть ситуация когда результат по размеру превысит 16 или 32 бита, тогда старшая часть результата умножения заноситься в dx или edx соответственно.

imul множитель_1 - операция умножения двух целочисленных двоичных значений со знаком

Деление двоичных чисел

div делитель - выполнение операции деления двух двоичных беззнаковых значений

Алгоритм работы:

Для команды необходимо задание двух операндов -- делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, который указывается в команде. Расположение результата зависит от размера делителя.

div dl ;ah:al=ax/dl, ax -делимое, dl- делитель , ah-частное, al -остаток

div x1 ;ax:dx=dx:ax/0ad91h, dx:ax -делимое, x1 word- делитель ,

;ax-частное, dx -остаток

div ecx ;eax:edx=edx:eax/ecx, edx:eax -делимое, ecx- делитель ,

;eax-частное, edx -остаток

idiv делитель - операция деления двух двоичных значений со знаком

Пример 7. Умножение двух однобайтных чисел.

model small

.stack 100h

.data

x1 db 78 ;первый множитель

yl db ? ;первый байт результата

yh db ? ;второй байт результата

.code

start:

mov ax,@data

mov ds,ax

xor ax, ax ;очищаем регистр ax

mov al, 25 ;помещаем в al второй сомножитель

mul x1

jnc m1 ;если нет переполнения, переходим на метку m1

mov yh,ah ;иначе старший байт результата помещаем в yh

m1:

mov yl, al ;результат помещаем на место

mov ax,4c00h

int 21h

end start

Пример 8. Деление двух однобайтных чисел.

model small

.stack 100h

.data

x1 db 6 ;делитель

yl db ? ;остаток

yh db ? ;частное

.code

start:

mov ax,@data

mov ds,ax

xor ax, ax ;очищаем регистр ax

mov ax, 25 ;помещаем в al делимое

div x1

mov yh,ah ;помещаем частное на место

mov yl, al ;помещаем остаток на место

mov ax,4c00h

int 21h

end start

ASCII коды и их интепритация

Ввод информации с клавиатуры и вывод ее на экран осуществляется в символьном виде, т.е. любой символ предоставляется в ASCII кодах. Причем на один символ идет один ASCII код. На два символа - два ASCII кода, и т.д. Любое число, вводимое с клавиатуры и выводимое на экран, представляется последовательностью ASCII кодов.

Табл.1. ASCII коды цифр

Символ шестнадцатеричной цифры

Двоичная тетрада

ASCII код

(двоичное представление)

Разница

0

0000

30h (0011 0000)

30h

1

0001

31h (0011 0001)

30h

2

0010

32h (0011 0010)

30h

3

0011

33h (0011 0011)

30h

4

0100

34h (0011 0100)

30h

5

0101

35h (0011 0101)

30h

6

0110

36h (0011 0110)

30h

7

0111

37h (0011 0111)

30h

8

1000

38h (0011 1000)

30h

9

1001

39h (0011 1001)

30h

A a

1010

41h (0100 0001) 61h (0110 0001)

37h 57h

B b

1011

42h (0100 0010) 62h (0110 0010)

37h 57h

C c

1100

43h (0100 0011) 63h (0110 0011)

37h 57h

D d

1101

44h (0100 0100) 64h (0110 0100)

37h 57h

E e

1110

45h (0100 0101) 65h (0110 0101)

37h 57h

F f

1111

46h (0100 0110) 66h (0110 0110)

37h 57h

Рассмотрим последовательность действий для преобразования чисел в их ASCII код и наоборот.

Ввод информации с клавиатуры:

1. Ввод символа с клавиатуры, один ASCII код находится в dl. Заранее не известно, что это за число от 0 до 9 или от а до f.

Cmp dl, 040h

Jb m1 ; если ASCII код меньше 40h значит ввели цифру от 0 до 9,

;переходим на метку m1

Cmp dl, 047h ; иначе ввели букву, заглавную или маленькую?

Jb m2 ;если ввели заглавную, переходим на m2, иначе выполняем

;дальше по программе

sub dl, 057h ;в dl получаем из символов число a..f h

jmp m3 ;переходим на m3 чтобы не выполнять лишних вычислений

m2: sub dl, 037h ;в dl получаем из символов число a..f h

jmp m3

m1: sub dl, 030h ;в dl получаем из символов число 0..9 h

m3:

Далее приведен оптимизированный код преобразования числа из ASCII кодов. Подумайте в чем разница.

Cmp dl,040h

Jb m1

Cmp dl,047h

Jb m2

Sub dl, 020h

m2: sub dl, 07h

m1: sub dl, 030h

2. Ввод строки, отличается только тем, что такое сравнение надо проводить с каждым элементом, т.е. надо организовать цикл и обращение к каждому элементу. Рассмотрим позднее.

Вывод информации на экран

1. Предположим что, число, которое мы хотим вывести, находится в регистре bl. Вывод символа осуществляется из регистра dl, 02 функция INT 21H. Число может быть одно или двузначное, например 7h или 5Fh. Для универсальности программы будем считать, что надо вывести двузначное число. А для этого надо получить отдельно десятки и единицы, и получить для них два ASCII кода.

;двузначное число которое хотим вывести находится в bl

mov dl, bl ; помещаем число в регистр dl

;сдвигаем содержимое dl на 4 бита вправо, чтобы получить отдельно десятки

shr dl, 4

and bl, 0fh ;получаем отдельно единицы

cmp dl, 0ah ;сравниваем dl с ah

jb m1 ;если меньше переходим на m1

add dl, 07h

m1: add dl, 30h

mov ah, 02h

int 21h

mov dl, bl

cmp dl, 0ah ;сравниваем dl с ah

jb m2

add dl, 07h

m2: add dl, 30h

int 21h

Попробуйте сами разобраться в приведенном кусочке кода.

Команды передачи управления

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

1. Команды безусловной передачи управления:

- команда безусловного перехода; jmp

- вызова процедуры и возврата из процедуры; call, ret

- вызова программных прерываний и возврата из программных прерываний. Int, iret

2. Команды условной передачи управления:

- команды перехода по результату команды сравнения cmp;

- команды перехода по состоянию определенного флага;

- команды перехода по содержимому регистра ecx/cx.

3. Команды управления циклом:

- команда организации цикла со счетчиком ecx/cx;

- команда организации цикла со счетчиком ecx/cx с возможностью досрочного выхода из цикла по дополнительному условию.

jmp адрес_перехода - безусловный переход без сохранения информации о точке возврата. Аналог goto.

Условные переходы

Команды условного перехода имеют одинаковый синтаксис:

jcc метка_перехода

Мнемокод всех команд начинается с “j” -- от слова jump (прыжок), cc -- определяет конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то эта метка может находится только в пределах текущего сегмента кода, межсегментная передача управления в условных переходах не допускается.

Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления. Источниками такого условия могут быть:

- любая команда, изменяющая состояние арифметических флагов;

- команда сравнения cmp, сравнивающая значения двух операндов;

- состояние регистра ecx/cx.

jcxz метка_перехода (Jump if cx is Zero) -- переход, если cx ноль;

jecxz метка_перехода (Jump Equal ecx Zero) -- переход, если ecx ноль.

Условные переходы по содержимому флагов

Название флага 

Номер бита в eflags/flag

Команда условного перехода 

Значение флага для осуществления перехода

Флаг переноса cf 

jc 

cf = 1 

Флаг четности pf 

jp 

pf = 1 

Флаг нуля zf 

jz 

zf = 1 

Флаг знака sf 

js 

sf = 1 

Флаг переполнения of 

11 

jo 

of = 1 

Флаг переноса cf 

jnc 

cf = 0 

Флаг четности pf 

jnp 

pf = 0 

Флаг нуля zf 

jnz 

zf = 0 

Флаг знака sf 

jns 

sf = 0 

Флаг переполнения of 

11 

jno 

of = 0 

Пример 9. Определите, равны ли два числа вводимые пользователем с клавиатуры. Определить равенство чисел можно используя вычитание, если разность исследуемых чисел равна 0, то они равны.

model small

.stack 100h

.data

s1 db числа равны$

s2 db числа не равны$

.code

start:

mov ax,@data

mov ds,ax

mov ah,01h

int 21h ;ввели первое число

mov dl,al ;посылаем в dl первое число

int 21h ;ввели второе число

sub al,dl ;сравнили числа

jnz m1 ;если получили не 0 результат, то на метку m1

mov dx, offset s1 ;иначе выводим строку s1, о том что числа равны.

jmp m2

m1: mov dx, offset s2 ;числа не равны, выводим строку s2

m2: mov ah,09h

int 21h ;вывод информационную строку

mov ax,4c00h

int 21h

end start

Команда сравнения cmp

cmp операнд_1,операнд_2 - сравнивает два операнда и по результатам сравнения устанавливает флаги. Команда сравнения cmp имеет интересный принцип работы. Он абсолютно такой же, как и у команды вычитания sub. Единственное, чего она не делает -- это запись результата вычитания на место первого операнда.

Алгоритм работы:

-выполнить вычитание (операнд1-операнд2);

-в зависимости от результата установить флаги, операнд1 и операнд2 не изменять (то есть результат не запоминать).

Условные переходы после команд сравнения

Типы операндов

Мнемокод команды условного перехода

Критерий условного перехода

Значения флагов для осществления перехода

Любые 

je 

операнд_1 = операнд_2 

zf = 1 

Любые 

jne 

операнд_1<>операнд_2 

zf = 0 

Со знаком 

jl/jnge 

операнд_1 < операнд_2 

sf <> of

Со знаком 

jle/jng 

операнд_1 <= операнд_2 

sf <> of or zf = 1 

Со знаком 

jg/jnle 

операнд_1 > операнд_2 

sf = of and zf = 0

Со знаком 

jge/jnl 

операнд_1 => операнд_2 

sf = of 

Без знака 

jb/jnae 

операнд_1 < операнд_2 

cf = 1 

Без знака 

jbe/jna 

операнд_1 <= операнд_2 

cf = 1 or zf=1 

Без знака 

ja/jnbe 

операнд_1 > операнд_2 

cf = 0 and zf = 0 

Без знака 

jae/jnb 

операнд_1 => операнд_2 

cf = 0 

Пример 10. Определите, равны ли два числа вводимые пользователем с клавиатуры.

model small

.stack 100h

.data

s1 db числа равны$

s2 db числа не равны$

.code

start:

mov ax,@data

mov ds,ax

mov ah,01h

int 21h ;ввели первое число

mov dl,al

mov ah,01h

int 21h ;ввели второе число

cmp al,dl ;сравнили числа

jne m1

mov dx, offset s1

jmp m2

m1: mov dx, offset s2

m2: mov ah,09h

int 21h ;вывод информационную строку

mov ax,4c00h

int 21h

end start

Пример 11. Даны три числа, найти среди них максимальное.

model small

.stack 100h

.data

s1 db максимальное число,10,13,$

x1 db 34

x2 db 56

x3 db 45

.code

start:

mov ax,@data

mov ds,ax

mov dx, offset s1

mov ah,09h

int 21h ;вывод информационную строку

;находим максимальное число

mov dl,x1 ;dl:=x1

cmp dl,x2 ;сравниваем х1 и х2

ja m1 ;если х1>х2, то на m1

mov dl,x2 ;иначе dl:=x2

m1: cmp dl,x3 ;сравниваем dl и х2

ja m2 ;если dl>х3 то на m2

mov dl,x3

;в dl находится самый максимальный элемент

m2: mov ah,02h

int 21h ;выводим максимальный элемент

mov ax,4c00h

int 21h

end start

Организация циклов
loop метка_перехода (Loop) -- повторить цикл
Работа команды заключается в выполнении следующих действий:
- декремента регистра ecx/cx;
- сравнения регистра ecx/cx с нулем:
- если (ecx/cx) > 0, то управление передается на метку перехода;

- если (ecx/cx) = 0, то управление передается на следующую после loop команду

Организация цикла:

mov cx, количество циклов

м1: тело цикла

loop m1

loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) -- повторить цикл, пока cx <> 0 или zf = 0.

loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) -- повторить цикл пока cx <> 0 или zf = 1

Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от -128 до +127 байт).

Организация вложенных циклов:

mov cх,n</ ...........



Страницы: [1] | 2 | 3 |








 
 
Показывать только:




Портфель:
Выбранных работ  


Рубрики по алфавиту:
А Б В Г Д Е Ж З
И Й К Л М Н О П
Р С Т У Ф Х Ц Ч
Ш Щ Ъ Ы Ь Э Ю Я

 

 

Ключевые слова страницы: Программирование контроллера приоритетных прерываний | методичка

СтудентБанк.ру © 2014 - Банк рефератов, база студенческих работ, курсовых и дипломных работ, шпаргалок и докладов по различным дисциплинам, а также отчеты по практике и многое другое - бесплатно.
Лучшие лицензионные казино с выводом денег