Написал программу, компилируется без ошибок, все функции работают, но при выборе пункта меню tasm зависает (не реагирует на последующий ввод). Программа резидентная. Компиляцию проводил следующими командами:
tasm /zi main.asm
tlink /t main
Кто может помогите с пунктами меню, буду очень благодарен и в долгу не останусь, нужно срочно до завтрашнего утра. Спасибо за понимание!
.model tiny
.code
.386
org 2Ch
envseg dw ?
org 80h
cmd_len db ? ;довжина командного рядка
cmd_line db ? ;командний рядок
org 100h
start:
LOCALS
JUMPS
jmp initialize
hw_reset9: retf
int09h_handler proc far ;процедура оброник переривання від клавіатури
jmp short actual_int09h_handler
old_int09h dd ?
dw 424Bh
db 00h
jmp short hw_reset9
db 7 dup (0)
actual_int09h_handler:
pushf
call dword ptr cs:old_int09h
pusha
push ds
push es
push 0040h
pop ds
mov di,word ptr ds:001Ah
cmp di,word ptr ds:001Ch
je exit_09h_handler ;якщо буфер пустий - стрибок на вихід
mov ax,word ptr [di] ;преревірка натиснутої клавіші
cmp ah,02h
jne proc_two
call perevirka ;виклик процедури
mov word ptr ds:001Ch,di
pusha
cli
;виведення повідомлення
mov ah,03h
int 10h
mov ax, cs
mov es, ax
mov bp, offset msgOne
mov cx, 23
mov ax, 1300h
mov bl, 00000111b
int 10h
mov ax, 0200h
mov bh, 0
mov dl, 0
inc dh
int 10h
sti
popa
jmp exit_09h_handler
proc_two:
mov ax,word ptr [di]
cmp ah,03h
jne proc_three
call objednannya
mov word ptr ds:001Ch,di
pusha
cli
mov ah,03h
int 10h
mov ax, cs
mov es, ax
mov bp, offset msgTwo
mov cx, 23
mov ax, 1300h
mov bl, 00000111b
int 10h
mov ax, 0200h
mov bh, 0
mov dl, 0
inc dh
int 10h
sti
popa
jmp exit_09h_handler
proc_three:
mov ax,word ptr [di]
cmp ah,04h
jne proc_four
call peretyn
mov word ptr ds:001Ch,di
pusha
cli
mov ah,03h
int 10h
mov ax, cs
mov es, ax
mov bp, offset msgThree
mov cx, 25
mov ax, 1300h
mov bl, 00000111b
int 10h
mov ax, 0200h
mov bh, 0
mov dl, 0
inc dh
int 10h
sti
popa
jmp exit_09h_handler
proc_four:
mov ax,word ptr [di]
cmp ah,05h
jne exit_09h_handler
call riznucya
mov word ptr ds:001Ch,di
pusha
cli
mov ah,03h
int 10h
mov ax, cs
mov es, ax
mov bp, offset msgFour
mov cx, 27
mov ax, 1300h
mov bl, 00000111b
int 10h
mov ax, 0200h
mov bh, 0
mov dl, 0
inc dh
int 10h
exit_09h_handler:
pop es
pop ds
popa
iret
; Дані які використовує процедура
k dw 5
m1 db 3,4,5,8
m2 db 2,4,7
M db ?
P db ?
R db ?
per db 0
msgOne db '1',13,10
msgTwo db '2',13,10
msgThree db '3',13,10
msgFour db '3',13,10
YesMessage DB 'element is in set',13,10,'$'
NoMessage DB 'element is not in set',13,10,'$'
perevirka proc near
pusha
mov ax,4
mov bh,8
div bh
mov bl,al
mov bh,0
mov al,m1[bx]
mov cl,ah
shl al,cl
test al,80h
jz no
yes:
mov ah,9
mov dx,OFFSET YesMessage
int 21h
ret
no:
mov ah,9
mov dx,OFFSET NoMessage
int 21h
popa
ret
perevirka endp
objednannya proc near
pusha
mov cx,3
mov bx,0
mov di,0
ob1:
push cx
mov cx,4
mov al,m1[bx]
mov M[bx],al
inc bx
loop ob1
pop cx
ob2:
push cx
mov cx,4
ob3:
mov al,m2[bx]
cmp al,m1[di]
jne ob4
mov per,1
ob4:
loop ob3
cmp per,1
je ob5
mov al,m2[bx]
mov M[bx],al
inc bx
ob5:
pop cx
loop ob2
popa
ret
objednannya endp
peretyn proc near
pusha
mov cx,12
mov bx,0
mov di,0
z1:
Z2:
mov al,m1[bx]
cmp al,m2[di]
je z3
inc bx
loop z1
inc di
mov bx,0
loop z2
z3:
mov P[bx],al
inc bx
cmp cx,0
jne z1
popa
ret
peretyn endp
riznucya proc near
pusha
mov cx,12
mov bx,0
mov di,0
r1:
r2:
mov al,m1[bx]
cmp al,m2[di]
je r3
inc bx
loop r1
inc di
mov bx,0
loop r2
r3:
mov P[bx],al
inc bx
cmp cx,0
jne r1
popa
ret
riznucya endp
int09h_handler endp
hw_reset2D: retf
;Процедура обробник мультиплексорного преривання
int2Dh_handler proc far
jmp short actual_int2Dh_handler
old_int2Dh dd ?
dw 424Bh
db 00h
jmp short hw_reset2D
db 7 dup (0)
actual_int2Dh_handler:
db 80h,0FCh
mux_id db ?
je its_us
jmp dword ptr cs:old_int2Dh
its_us:
cmp al,06
jae int2D_no
cbw
mov di,ax
shl di,1
jmp word ptr cs:jumptable[di]
;Таблиця стрибків на функції мультиплексорного переривання
jumptable dw offset int2D_00,offset int2D_no
dw offset int2D_02,offset int2D_no
dw offset int2D_04,offset int2D_05
;Функція преревірки в наявності
int2D_00:
mov al,0FFh
mov cx,0100h
push cs
pop dx
mov di,offset amis_sign
iret
int2D_no:
mov al,00h
iret
unload_failed:
mov al, 01h
iret
;Функція вивантаження з памяті
int2D_02:
cli
push 0
pop ds
mov ax,cs
cmp ax,word ptr ds:[09h*4+2]
jne unload_failed
cmp ax,word ptr ds:[2Dh*4+2]
jne unload_failed
push bx
push dx
mov ax,2509h
lds dx,dword ptr cs:old_int09h
int 21h
mov ax,252Dh
lds dx,dword ptr cs:old_int2Dh
int 21h
mov ah,51h
int 21h
mov word ptr cs:[16h],bx
pop dx
pop bx
mov word ptr cs:[0Ch],dx
mov word ptr cs:[0Ah],bx
push cs
pop bx
mov ah,50h
int 21h
mov ax,4CFFh
int 21h
;отримати список переривань
int2D_04:
mov dx,cs
mov bx,offset amis_hooklist
iret
;Отримати список перехоплених клавіш
int2D_05:
mov al,0FFh
mov dx,cs
mov bx,offset amis_hotkeys
iret
int2Dh_handler endp
;сигнатура
amis_sign db "Pankiv "
db "Course "
db "Course Project",0
;переривання
amis_hooklist db 09h
dw offset int09h_handler
db 2Dh
dw offset int2Dh_handler
;Список клавіш
amis_hotkeys db 01h
db 5
db 02h,03h,04h,05h,06h
dw 0
db 1
;Процедура ініціалізації
initialize proc near
jmp short initialize_entry_point
exit_with_message:
mov ah,9
int 21h
ret
;Прграма вже завантажена
already_loaded:
cmp byte ptr unloading,1
je do_unload
mov dx,offset already_msg
jmp short exit_with_message
;проблеми з завантаженням
cant_unload1:
mov dx,offset cant_unload1_msg
jmp short exit_with_message
;вивантаження з памяті
do_unload:
inc ah
mov al,02h
mov dx,cs
mov bx,offset exit_point
int 2Dh
push cs
pop ds
mov dx,offset cant_unload2_msg
jmp short exit_with_message
;вихід з програми
exit_point:
push cs
pop ds
mov dx,offset unloaded_msg
push 0
jmp short exit_with_message
;Перевірка командного рядка
initialize_entry_point:
cld
cmp byte ptr cmd_line[1],'/'
jne not_unload
cmp byte ptr cmd_line[2],'u'
jne not_unload
mov byte ptr unloading,1
not_unload:
mov ah,9
mov dx,offset usage
int 21h
mov ah,-1
more_mux:
mov al,00h
int 2Dh
cmp al,00h
jne not_free
mov byte ptr mux_id,ah
jmp short next_mux
not_free:
mov es,dx
mov si,offset amis_sign
mov cx,16
repe cmpsb
jcxz already_loaded
next_mux:
dec ah
jnz more_mux
free_mux_found:
cmp byte ptr mux_id,0
je no_more_mux
mov ax,352Dh
int 21h
mov word ptr old_int2Dh,bx
mov word ptr old_int2Dh+2,es
mov ax,3509h
int 21h
mov word ptr old_int09h,bx
mov word ptr old_int09h+2,es
mov ax,252Dh
mov dx,offset int2Dh_handler
int 21h
mov ax,2509h
mov dx,offset int09h_handler
int 21h
mov ah,49h
mov es,word ptr envseg
int 21h
mov ah,9
mov dx,offset installed_msg
int 21h
mov dx,offset initialize
int 27h
no_more_mux:
mov ah,9
mov dx,offset no_more_mux_msg
int 21h
ret
usage db 'by Volodymyr Karplyuk (SI-31, TNTU)',13,10
db '[1] Perevirka',0Dh,0Ah
db '[2] Objednannya',0Dh,0Ah
db '[3] Peretyn',0Dh,0Ah
db '[4] Riznucya',0Dh,0Ah
db 'main.com /u - to unload program from memory',0Dh,0Ah
db '',0Dh,0Ah
db '$'
already_msg db 'ERROR: Already loaded',0Dh,0Ah,'$'
no_more_mux_msg db 'ERROR: Too many TSR programs'
db ' loaded',0Dh,0Ah,'$'
installed_msg db 'Installed successfully',0Dh,0Ah,'$'
cant_unload1_msg db "ERROR: Can't unload: program not found in memory",0Dh,0Ah,'$'
cant_unload2_msg db "ERROR: Can't unload: another TSR hooked interrupts",0Dh,0Ah,'$'
unloaded_msg db 'Unloaded successfully',0Dh,0Ah,'$'
unloading db 0
initialize endp
;_main endp
end start