LINUX.ORG.RU

Проблема с выбором пунктов меню

 ,


0

3

Написал программу, компилируется без ошибок, все функции работают, но при выборе пункта меню 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



Последнее исправление: Vov4ik109 (всего исправлений: 1)

Раз срочно, то для ускорения процедуры предлагаю озвучить все типовые замечания разом. Начну:

-20

в job

сам решай, обленилась студентота

на винфак

неправильный асм

неправильный русский

4.3

4.8

5.3

5.5

минимальный нерабочий пример где

тот упоротый анон, который обосрет но поможет, где

а ты че хотел

t184256 ★★★★★
()
Ответ на: комментарий от t184256

неправильный асм, сам решай

Я не обратился бы за помощью на форум если бы мог сам решить. Убил два дня на поиски проблемы, но безрезультатно.

Vov4ik109
() автор топика
Ответ на: неправильный асм, сам решай от Vov4ik109

Я не обратился бы за помощью на форум

А теперь подними взгляд в верх страницы и посмотри, на какой форум ты пришел. Ты правда считаешь, что на linux.org.ru тебе будут разбирать простыню ассемблерного кода под дос?

Резюмируя: на винфак, быдло!

hippi90 ★★★★★
()

Попроси лучше симпатичную однокурсницу помочь тебе за секс.

hateyoufeel ★★★★★
()

Не срача ради. Помогите человеку, пожалуста! Неужели обосрать - это круто, а помочь - это отстой. Да, написано не под онтопик, да коментарии не на правильном русском, но надо уподобляться быдлу и обсерать?

anonymous
()
Ответ на: комментарий от anonymous

некорректное условие

Примерно область можете указать?

Vov4ik109
() автор топика
Ответ на: комментарий от anonymous

Цикл

Может тут проблема?

ob1: 

push cx
mov cx,4

mov al,m1[bx]
mov M[bx],al
inc bx

loop ob1
Возможно он бесконечный? И я вот подумал что скорее всего в M 4 байта не помещается.

Vov4ik109
() автор топика

.model tiny

С высоты нашего 2018го посоветую твоему 1988 — продавай всё имущество, скупай долгопортящиеся продукты и золото. Не спрашивай, зачем, так надо, потом благодарить будешь.

redgremlin ★★★★★
()
Ответ на: Цикл от Vov4ik109

Возможно он бесконечный?
mov cx,4
loop ob1

Возможно? Да ты в каждом проходе переинициализируешь cx, он у тебя и скачет 3-4, а в 0 никогда не опускается и цикл не заканчивается.

redgremlin ★★★★★
()
Ответ на: неправильный асм, сам решай от Vov4ik109

Для начала, лучше отредактировать первый пост и заменить текст программы на ссылку postebin.com и уже там разместить текст.

В эпоху многозадачных ОС резидентными иногда называют программы, загруженные постоянно и работающие в фоновом режиме. Но применение этого термина некорректно по отношению к многозадачным ОС

Не в этом ли проблема - программа ушла в фон, значит ввод с клавиатуры до нее не дойдет.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от redgremlin

Затраты на взятки чиновникам ради выездной визы всё равно отобьются.

luke ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.