Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Изучение системы прерываний




Практическая часть.

Сохранение состояния центрального процессора во время прерываний

При распознавании запроса прерывания управление программой переходит к соответствующей сервисной подпрограмме путем выполнения центральным процессором команды длинного вызова (LCALL). Адрес программы охраняется в стеке. После завершения сервисной подпрограммы инструкция RETI возвращает процессор в основную программу в точку прерывания. Программа обработки прерывания не должна изменять значения переменных, используемых в основной программе, для возможности продолжения правильной работы последней. Инструкции PUSH и POP обеспечивают сохранение регистров в стеке.

LOC EQU $; Запоминание счетчика адреса

ORG 0C003H; Начальный адрес подпрограммы прерывания

LJMP SERV

 

2. Ввести в аккумулятор данные из порта 2 и выделить требуемые биты по маске, находящейся в R0:

MOV A,P2; Ввод из порта 2

ANL A,R0; Маскирование

 

3.Выполнить логический сдвиг влево двухбайтного слова, расположенного в (R2) (A):

SHIF: RLC A; Сдвиг младшего байта

XCH A,R2; Обмен аккумулятора и расширителя

RLC A; Сдвиг старшего байта

XCH A,R2; Обмен

 

4. Выполнить арифметический сдвиг двухбайтного слова (R2) (A) вправо:

 

SHIF: SETB C; Установка флага переноса

XCH A,R2; Обмен байтами

B A.7,NO; Если R2.7 не равно 1, то сброс

CLR C; флага переноса

NO: RRCA; Сдвиг флага переноса в расширитель

XCH A,R2; Обмен

RRC A; Сдвиг младшего байта

 

5. Умножить аккумулятор на число 2 в степени Х, где Х – число не более 8, хранящееся в R2. Умножение на 2 заменяется арифметическим сдвигом влево аккумулятора и расширителя R1:

 

MOV R1,#0; Сброс R1

CLR C; Сброс флага переноса

L: RLC A; Арифметический сдвиг влево объединенного

XCH A,R1; 16-битного результата в

RLC A; регистровой паре (R1)(A)

XCH A,R1

DJNZ R2,L

 

6. Определить четность числа единиц в аккумуляторе:

 

CLR F0; Сброс F0

MOV R7,#9; Число повторов

L: RRC A; Пересылка бита А.0 в перенос

JNC N; Пропустить, если бит равен 0

CPL F0; Подсчет паритета

N: DJNZ R7,L

 

После выполнения программы аккумулятор сохранит свое значение, флаг F0 будет установлен, если число единиц в аккумуляторе было нечетно. Флаг F0 входит в состав PSW и в данном примере специфицирован пользователем для выполнения функций флага паритета.

7. Вычислить булеву функцию трех переменных:

Y = X Ç`V È W Ç (XÈV). Переменные X, `V, W поступают на линии 2, 1, и 0 порта 1 соответственно. Результат Y необходимо вывести на линию 3 порта 1:

 

Y EQU P1.3

X EQU P1.2

V EQU P1.1

W EQU P1.0

 

MOV C,X; Ввод Х

ANL C,V; X AND NOT (V)

MOV F0,C; Запоминание результата в F0

MOV C,X; Ввод X

ORL C,V; X OR V

ANL C,W; W AND (X OR V)

ORL C,F0; (W AND (X OR V)) OR (X AND NOT (V))

MOV Y,C; Вывод результата

 

Флаг F0 используется для промежуточного хранения первой конъюнкции X Ç`V.

Задания 1.

1. Составить программы для вычисления выражений (для умножения и деления использовать операции сдвига, операнды и результат находятся в памяти): Четные разряды результата инвертировать Y=(38-90/2)/2-11

2. Записать в четные разряды результата единицы: Y=(233/8-44)*4

3. Записать в нечетные разряды результата нули: Y=(61+128/2)/8-3

4. Определить старший полубайт: Y=(24*4-8*2)/4

5. Определить младший полубайт: Y=(123*4-289)/8

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

7. Написать программу, записывающую последовательность бит в аккумуляторе в обратном порядке (0010011111100100).

8. Написать программу, записывающую в старшую тетраду аккумулятора зеркальное отображение младшей (1111001111000011).

Задания 2.

1. Выбрать второй регистровый банк. Установить биты 0, 2, 6 регистра R4. Сбросить биты 1, 3, 7 порта Р2, используя маску, вычисленную с помощью регистра R4.

2. Выбрать первый регистровый банк. Установить биты 0, 1, 2, 3 порта Р1. Определить и записать в регистры R1-R4 флажки, указывающие на то, взвелись ли биты 4-7 порта Р1.

3. Последовательно с помощью модифицируемой маски, хранящейся в регистре R3, установить и сбросить биты с 3-го по 6-ой порта Р1.

4. Записать в аккумулятор и порт Р2 произвольные числа. Проинвертировать биты порта Р2, соответствующие единичным битам аккумулятора.

5. Выбрать третий банк регистров. С помощью модифицируемой маски установить во всех портах биты, соответствующие номеру порта.

 

ADDC A,@R0

DA A; Десятичная коррекция

MOV @R1,A; Запись в буфер

MOV А,#4; Индекс для продолжения программы

JMP @A+DPTR; Переход к инструкции, следующей за списком параметров.

Следует учесть, что инструкции ACALL и LCALL не используются в программе, поскольку каждая из них заносит адрес в стек. В то же время инструкция MOVC имеет доступ ко всем 64 К байтам адресного пространства памяти программ микроЭВМ.

Задания 1.

Составить два варианта программы без подпрограмм и с подпрограммой.

1. Разработайте программу сортировки массива по возрастанию.

2. Разработайте программу сортировки массива по убыванию.

3. Реализуйте на ассемблере BASIC-программу:

10 LET A=7

20 FOR B=2 TO 9

30 IF B<4 THEN GO SUB 60

40 NEXT B

50 GO TO 80

60 LET A=A+B

70 RETURN

80 STOP

4. Разработайте программу подсчета количества ячеек памяти со значениями, отличными от 38h.

5. Напишите программу подсчета количества ячеек памяти, значения которых меньше или равны A3h.

6. Разработайте программу подсчета количества отрицательных и положительных чисел, при этом считать, что ноль – положительное число.

7. Напишите подпрограмму вычисления чисел Фибоначчи.

Алгоритм:

А1=1; А2=1

Аi =Ai-2+Ai-1.

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

 

Индивидуальные задания 2

1. Написать программу, вычисляющую 20 значений массива А по формуле А[i]=7*i + 5; i = 0...19.

Полученный массив записать в РПД, начиная с адреса 40Н.

2. Написать подпрограмму, копирующую в цикле 10 байт из РПД, наложенных на маску 1001100lb, начиная с адреса 50Н, во внешнюю память данных (ВПД), начиная с адреса С200Н. В программе осуществить вызов этой процедуры и возврат из нее.

3. Написать подпрограмму, сканирующую в цикле состояние регистров R0-R7 текущего регистрового банка. Если значение регистра равно нулю - соответствующий

номеру регистра бит аккумулятор тоже сбрасывается. Если регистр не равен нулю - в

 

;Таблица векторов переходов

TABLE: DB ROUT0; Начальный адрес программы ROUT0

DB ROUT1

DB ROUT2

DB ROUTF; Начальный адрес программы ROUTF

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...