Ведущий ПКП имеет два программно доступных регистра с адресами 20h и 21h. Ведомый ПКП имеет два программно доступных регистра с адресами А0h и А1h. Назначение обоих регистров в ведущем и ведомом ПКП аналогично.
Листинги с коментариями:
Ведущий
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h
begin:
call clean
or ax,10b ;устанавливаем 2 бит, чтобы
out 20h,ax ; открыть доступ для чтения регистра isr
in ax,20h ; считываем содержимое регистра isr
call main
call NEWSTR
call clean
or ax,01b ;тоже самое, только для регистра irr
out 20h,ax ;
in ax,20h
call main
int 20h
;*******************процедуры**********************
;переход на новую строку
NEWSTR proc
mov ah,02h
mov dl,13
int 21h
mov dl,10
int 21h
ret
NEWSTR endp
;процедура перевода в двоичную систему содержимого регистров и вывода на экран
main proc
mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1 ;сдвиг,если CF=1,то переход на метку m2(печатаем "1"),иначе m3 (печатаем "0")
jc m2
jmp m3
m2:
mov dx,'1'
mov ah,02h
int 21h
loop m1
m3:
mov ah,02h
mov dx,'0'
int 21h
loop m1
main endp
;процедура очистки регистров
clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp
cseg ends
end begin
ведомый ПКП,тоже самое, только порт уже 160(0Ah)
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h
begin:
call clean
or ax,10b
out 0A0h,ax ;isr
in ax,0A0h
call main
call NEWSTR
call clean
or ax,01b
out 0A0h,ax ;irr
in ax,0A0h
call main
int 20h
write proc
mov ah,09h
int 21h
ret
write endp
NEWSTR proc
mov ah,02h
mov dl,13
int 21h
mov dl,10
int 21h
ret
NEWSTR endp
main proc
mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1
jc m2
jmp m3
m2:
mov dx,'1'
mov ah,02h
int 21h
loop m1
m3:
mov ah,02h
mov dx,'0'
int 21h
loop m1
main endp
clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp
cseg ends
end begin
собственно "зависающая программа" с теми же процедурами,все тоже самое
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h
begin:
;************************** ведущий ****************************
call clean
or ax,10b
out 20h,ax ;isr
in ax,20h
call main
call NEWSTR
call clean
or ax,01b
out 20h,ax ;irr
in ax,20h
call main
;************************** ведомый ****************************
call NEWSTR
call clean
or ax,10b
out 0A0h,ax ;isr
in ax,0A0h
call main
call NEWSTR
call clean
or ax,01b
out 0A0h,ax ;irr
in ax,0A0h
call main
int 20h
;*************************** процедуры**************************
write proc
mov ah,09h
int 21h
ret
write endp
NEWSTR proc
mov ah,02h
mov dl,13
int 21h
mov dl,10
int 21h
ret
NEWSTR endp
main proc
mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1
jc m2
jmp m3
m2:
mov dx,'1'
mov ah,02h
int 21h
loop m1
m3:
mov ah,02h
mov dx,'0'
int 21h
loop m1
main endp
clean proc
xor ax,ax
xor bx,bx
xor dx,dx
clean endp
cseg ends
end begin