Similar presentations:
Ввод–вывод с квитированием по прерыванию
1. Лабораторная работа №4
Ввод–вывод сквитированием по
прерыванию
Файл task4in или task4out.asm
Автор: асс. каф. РС
Гайворонский Дмитрий Вячес
2. Постановка задачи
На языке Ассемблера написать программу ввода сквитированием по запросу прерывания от внешнего
устройства 18 байт данных и размещения их в
памяти, начиная с адреса 1234h
Задать: 2000h - вершина стека, 32 – размер стека
Структурная схема МП-системы
CPU
8085
RST 7,5
RAM
Формат байта флагов F7-0
7 6
5
4 3 2 1 0
X X IBF X X X X X
I/O
(D7-0, F7-0)
Порты I/O: 38h для F7-0 и 39h для данных D7-0
2
3. Программный ввод-вывод с квитированием
вводвывод
IN port_Flag
IN port_Flag
Нет
IBF=1 ?
Да
IN port_Data
Нет
OBF=1 ?
Да
OUT port_Data
3
4. Назначение разрядов аккумулятора для команды SIM
SOD SOE0
0
X
X
R7.5 MSE M7.5 M6.5 M5.5
X
Сброс триггера RST7.5
0 – нет сброса
1 – сброс
Разрешение установки маски
!
Адреса прерываний
5,5x8 = 44d =2Ch
6.5x8 = 52d = 34h
7.5x8 = 60d = 3Ch
1
X
X
X
Маска
разрешение
прерывания по входу
0 – разрешение
1 - запрет
4
5. Data segment
;DATA SEGMENT - определение сегмента памяти данныхdefseg D_seg, start = 1234h, class = Data
seg D_seg
bet
ds
18
; Зарезервировать ячейки памяти M(bet)
;I/O SEGMENT - определение сегмента внешних устройств
defseg IO_seg, start = 38h, class = IOspace
seg IO_seg
F_38 ds
1
;
I_39 ds
1
;
; Задание сегмента стека
defseg stack_seg, start=2000h-32, class= data
seg stack_seg
ds
32
5
6. Code segment
defseg rst_75, start=3Ch, class= codeseg rst_75
jmp L2
; CODE SEGMENT - сегмент кода, содержащий программу
defseg Main_seg, start = 100h, class = Code
seg Main_seg
; Cлужебные команды для инициализации устройств
LXI SP,2000h
MVI A, 00100000b ; A <- 20h
OUT 38h ; I/O(38h) <- A = 20h
MVI A, 46h ; A <- 46h
OUT 39h ; I/O(39h) <- A = 46h
MVI A,00001011b
SIM
EI
L1: JMP L1
6
7. Code segment
; ПРОГРAММA ВВОДA ДAHHЫХL2:
PUSH PSW
PUSH H
PUSH B
LXI H,bet
MVI C,18
L3:
IN F_38
XRI 00100000b
OUT F_38
IN F_38
ANI 00100000b
JZ L3
IN I_39 ; A <- I/O(39) - ввод из внешнего устройства
MOV M,A ; M(HL) <- A - запись в память по адресу
INX H
; Содержимое rp H увеличить на 1
DCR C
JNZ L3
MVI A,00010000b
SIM
POP B
POP H
POP PSW
EI
RET
end
; Kонец программы
7
8. Постановка задачи
На языке Ассемблера написать программу выводас квитированием по запросу прерывания от
внешнего устройства 18 байт данных и размещения
их в памяти, начиная с адреса 1234h
Задать: 2000h - вершина стека, 32 – размер стека
Структурная схема МП-системы
CPU
8085
RST 6,5
RAM
Формат байта флагов F7-0
7
6
5 4 3 2 1 0
X OBF X X X X X X
I/O
(D7-0, F7-0)
Порты I/O: 38h для F7-0 и 39h для данных D7-0
8
9. Data segment
;DATA SEGMENT - определение сегмента памяти данныхdefseg D_seg, start = 1234h, class = Data
seg D_seg
bet
db
1,2,3,4,5…; Задание чисел для вывода M(bet)
;I/O SEGMENT - определение сегмента внешних устройств
defseg IO_seg, start = 38h, class = IOspace
seg IO_seg
F_38 ds
1
;
O_39 ds
1
;
; Задание сегмента стека
defseg stack_seg, start=2000h-32, class= data
seg stack_seg
ds
32
9
10. Code segment
defseg rst_65, start=34h, class= codeseg rst_65
jmp L2
; CODE SEGMENT - сегмент кода, содержащий программу
defseg Main_seg, start = 100h, class = Code
seg Main_seg
; Cлужебные команды для инициализации устройств
LXI SP,2000h
MVI A, 01000000b ; A <- 40h
OUT 38h ; I/O(38) <- A = 40h
MVI A,00001101b
SIM
EI
L1: JMP L1
10
11. Code segment
; ПРОГРAММA ВЫВОДA ДAHHЫХL2:
PUSH PSW
PUSH H
PUSH B
LXI H,bet
MVI C,18
L3:
IN F_38
XRI 01000000b
OUT F_38
IN F_38
ANI 01000000b
JNZ L3
MOV A,M
OUT O_39 ; I/O(39) <- A - вывод во внешнее устройство
INX H
; Содержимое rp H увеличить на 1
DCR C
JNZ L3
POP B
POP H
POP PSW
EI
RET
end
; Kонец программы
11
12. Командный файл task4in.cmd
LAtask4inLoad Avocet task4in (загрузка файла task4in)
D1A1234h
Dump 1 Address 1234h (настройка окна
памяти отладчика)
D2AI:38h
Dump 2 Address I/O 38h (настройка окна I/O
отладчика)
← 0100
Адрес входа в программу 100h
←SY
Включение счетчика циклов (счет тактов
выполнения программы)
12