smileman
Гость
|
|
« : 14-11-2008 23:15 » |
|
Создал 2 программы чтения регистров irr и isr ведомого и ведущего ПКП.Программы работают,выводится значения регистров.Соединил эти программы в одну,программа "виснет",не возвращается в DOS.Помогите,пож-та;в чем ошибка? Ведущий 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
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 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
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 15-11-2008 06:30 » |
|
smileman, а ты бы хоть комментарии написал, блок-схему показал...
|
|
|
Записан
|
|
|
|
smileman
Гость
|
|
« Ответ #2 : 15-11-2008 13:58 » |
|
Ведущий ПКП имеет два программно доступных регистра с адресами 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
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 15-11-2008 17:24 » |
|
smileman, посмотри clean proc - у тебя там нет ret.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
smileman
Гость
|
|
« Ответ #4 : 15-11-2008 17:36 » |
|
ммда..стыд и позор,какая глупая ошибка. Спасибо,RXL,заработало.
|
|
|
Записан
|
|
|
|
smileman
Гость
|
|
« Ответ #5 : 15-11-2008 17:57 » |
|
Так,теперь у меня вопрос о регистре масок прерываний. здесь я вроде бы замаскировал IRQ14-контроллер накопителя на гибких дисках-что должно происходить не знаю,происходит следующее:при первом запуске ничего не происходит,при повторном запуске,после запуска вышеуказанных программ,выводит почему-то(!) на экран содержимое регистров IRR и ISR,те то,что только что выводили приведенные выше программы. Вот сама программа: cseg segment assume cs:cseg, ss:cseg, ds:cseg, es:cseg org 100h
begin:
xor ax,ax
in al,0A1h or al,01000000b
out 0A1h,al
cseg ends
end begin
Что происходит,и что должно вообще происходить?помогите пожалуйста
|
|
« Последнее редактирование: 16-11-2008 07:34 от smileman »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #6 : 15-11-2008 18:43 » |
|
smileman, опять концовки программы нет... Где ret? Вообще, начинай пользоваться отладчиком - масса вопросов станет яснее. Может пригодится... ^8259 Programmable Interrupt Controller (PIC)
% Initialization Command Word 1 at Port 20h and A0h
і7і6і5і4і3і2і1і0і ICW1 і і і і і і і АДДДД 1=ICW4 is needed, 0=no ICW4 needed і і і і і і АДДДДД 1=single 8259, 0=cascading 8259's і і і і і АДДДДДД 1=4 byte interrupt vectors, 0=8 byte int vectors і і і і АДДДДДДД 1=level triggered mode, 0=edge triggered mode і і і АДДДДДДДД must be 1 for ICW1 (port must also be 20h or A0h) АДБДБДДДДДДДДД must be zero for PC systems
% Initialization Command Word 2 at Port 21h and A1h
і7і6і5і4і3і2і1і0і ICW2 і і і і і АДБДБДДДД 000= on 80x86 systems АДБДБДБДБДДДДДДДДД A7-A3 of 80x86 interrupt vector
% Initialization Command Word 3 at Port 21h and A1h
і7і6і5і4і3і2і1і0і ICW3 for Master Device і і і і і і і АДДДД 1=interrupt request 0 has slave, 0=no slave і і і і і і АДДДДД 1=interrupt request 1 has slave, 0=no slave і і і і і АДДДДДД 1=interrupt request 2 has slave, 0=no slave і і і і АДДДДДДД 1=interrupt request 3 has slave, 0=no slave і і і АДДДДДДДД 1=interrupt request 4 has slave, 0=no slave і і АДДДДДДДДД 1=interrupt request 5 has slave, 0=no slave і АДДДДДДДДДД 1=interrupt request 6 has slave, 0=no slave АДДДДДДДДДДД 1=interrupt request 7 has slave, 0=no slave
і7і6і5і4і3і2і1і0і ICW3 for Slave Device і і і і і АДБДБДДДД master interrupt request slave is attached to АДБДБДБДБДДДДДДДДД must be zero
% Initialization Command Word 4 at Port 21h and A1h
і7і6і5і4і3і2і1і0і ICW4 і і і і і і і АДДДД 1 for 80x86 mode, 0 = MCS 80/85 mode і і і і і і АДДДДД 1 = auto EOI, 0=normal EOI і і і і АДБДДДДДД slave/master buffered mode (see below) і і і АДДДДДДДДД 1 = special fully nested mode (SFNM), 0=sequential АДБДБДДДДДДДДДД unused (set to zero)
% Bits % 32 Buffering Mode 00 not buffered 01 not buffered 10 buffered mode slave (PC mode) 11 buffered mode master (PC mode)
% Operation Control Word 1 / Interrupt Mask Reg. (Ports 21h & A1h)
і7і6і5і4і3і2і1і0і OCW1 - IMR Interrupt Mask Register і і і і і і і АДДДД 0 = service IRQ0, 1 = mask off і і і і і і АДДДДД 0 = service IRQ1, 1 = mask off і і і і і АДДДДДД 0 = service IRQ2, 1 = mask off і і і і АДДДДДДД 0 = service IRQ3, 1 = mask off і і і АДДДДДДДД 0 = service IRQ4, 1 = mask off і і АДДДДДДДДД 0 = service IRQ5, 1 = mask off і АДДДДДДДДДД 0 = service IRQ6, 1 = mask off АДДДДДДДДДДД 0 = service IRQ7, 1 = mask off
% Operation Control Word 2 / Interrupt Command Reg. (Ports 20h & A0h)
і7і6і5і4і3і2і1і0і OCW2 - ICR Interrupt Command Register і і і і і АДБДБДДДД interrupt request level to act upon і і і і АДДДДДДДДД must be 0 for OCW2 і і і АДДДДДДДДДД must be 0 for OCW2 АДБДБДДДДДДДДДДД EOI type (see table)
% Bits % 765 EOI - End Of Interrupt code (PC specific) 001 non-specific EOI command 010 NOP 011 specific EOI command 100 rotate in automatic EOI mode 101 rotate on non-specific EOI command 110 set priority command (uses bits 2-0) 111 rotate on specific EOI command
% Operation Control Word 3 (Ports 20h & A0h)
і7і6і5і4і3і2і1і0і OCW3 і і і і і і і АДДД 1=read IRR on next read, 0=read ISR on next read і і і і і і АДДДД 1=act on value of bit 0, 0=no action if bit 0 set і і і і і АДДДДД 1=poll command issued, 0=no poll command issued і і і і АДДДДДД must be 1 for OCW3 і і і АДДДДДДД must be 0 for OCW3 і і АДДДДДДДД 1=set special mask, 0=reset special mask і АДДДДДДДДД 1=act on value of bit 5, 0=no action if bit 5 set АДДДДДДДДДД not used (zero)
% Other Registers
IRR - Interrupt Request Register, maintains a bit vector indicating which IRQ hardware events are awaiting service. Highest level interrupt is reset when the CPU acknowledges interrupt. ISR - In Service Register, tracks IRQ line currently being serviced. Updated by EOI command.
^Hardware Interrupt Sequence of Events:
1. 8259 ~IRQ~ signal is raised high by hardware setting the corresponding IRR bits true.
2. PIC evaluates the interrupt requests and signals the CPU where appropriate.
3. CPU acknowledges the INT by pulsing INTA (inverted)
4. INTA signal from CPU is received by the PIC, which then sets the highest priority ISR bit, and clears the corresponding IRR bit
5. CPU sends a second INTA pulse which causes the PIC to send the interrupt ID byte onto the bus. CPU begins interrupt processing.
6. Interrupts of lower and equal priority are blocked until a Non-Specific EOI (20h) is sent to the command port.
^Initialization Procedure
% Initialization 1. write ICW1 to port 20h 2. write ICW2 to port 21h 3. if ICW1 bit D1=1 do nothing if ICW1 bit D1=0 write ICW3 to port 20h 4. write ICW4 to port 21h 5. OCW's can follow in any order
^8259 Programmable Interrupt Controller Notes
- Operation Command Word (OCW), commands that set the 8259 in various interrupt modes. These can be written to the 8259 anytime after initialization. - The 8259 differentiates between the OCW1, OCW2 and OCW3 by the port address and the value of the data bits D4 and D3. ICW2 through ICW4 are order related and must follow ICW1. ICW1 is identified by an even port number and data bit D4 set to 1. - PCs operate in fully nested mode, where a Non-Specific EOI resets the interrupt identified by the highest bit value in the ISR - 8259s can be chained together where the INT pin (output) of a slave 8259 can be used as the input to an IRQ line allowing up to 64 priority vectored interrupts. AT level machines use two 8259's for a total of 16 hardware interrupt levels - the first 8259 ports are located at 20h and 21h - the second 8259 ports are located at A0h and A1h - PC and AT interrupts are Edge Triggered while PS/2's are Level Triggered - some ASIC chips designed for Tandy 1000 Systems malfunction if specific and non-specific EOIs are mixed - for a more in-depth discussion of the 8259, see Intel's "Micro- processor and Peripherals Handbook, Volume I"
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
smileman
Гость
|
|
« Ответ #7 : 15-11-2008 19:08 » |
|
^_^ сам уже обнаружил..ret то я поставил,но все равно ничего не происходит.Вопрос остался,что вообще должно происходить-ничегонеделание это и есть "реакция"? код посмотрел,но насколько я понял,ответ этот код не дает на мой вопрос..
|
|
« Последнее редактирование: 15-11-2008 19:13 от smileman »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 15-11-2008 19:39 » |
|
Это не код - это дока. Просто подходящего тега не нашлось для обрамления.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|