Задачка по АСМе

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
XGarik
Сообщения: 10
Зарегистрирован: 20 апр 2006, 12:59

Привет всем!

Задание
Программа в цикле выводит на экран таблицу ASCII кодов (с 00 до FF) с интервалом 1 сек.
Обработчик CTRL+C делает подсчет нажатий на CTRL+C (n).
Когда n=5, выводит символ, на котором произошло событие.

Решение

Код: Выделить всё

.model small
	.stack 100h
	.486
	.data
mes1	db	'Please press Ctrl+C 5 raz'
len1	equ	$-mes1
mes2	db	0dh, 0ah,'Please press CTRL+Z to EXIT'
len2	equ	$-mes2
mes3	db	0dh, 0ah,'ASCII:',0dh, 0ah
len3	equ	$-mes3
mes4	db	'ASCII:'
len4	equ	$-mes4

sim	db	00h
cnt	db	0

clrscr	macro ;макрос очистки экрана
	mov	ah, 0
	mov	al, 3
	int	10h
endm

delay 	macro   time
	local	inner,outer
	mov	cx,time
outer:	push	cx
	mov	cx,0
inner:	loop	inner
	pop	cx
	loop	outer
endm

outmes1	macro	mes,len
	mov	ah, 40h
	mov	bx, 1
	mov	cx, len
	mov	dx, offset mes
	int	21h
endm

outchar	macro c
	mov	ah, 2
	mov	dl, c
	int	21h
endm

stop 	macro
	mov	ah,8
	int	21h
endm

wind	macro	f,scroll,xl,yl,xr,yr,atr
	mov	ah, f
	mov	al, scroll
	mov	bh, atr
	mov	ch, yl
	mov	cl, xl
	mov	dh, yr
	mov	dl, xr
	int	10h
endm

cprint	macro	mes,len,x,y,atr
	push	es
	mov	ax, ds
	mov	es, ax
	mov	ah, 13h
	mov	al, 1
	mov	bh, 0
	mov	bl, atr
	mov	cx, len
	mov	dh, y
	mov	dl, x
	mov	bp, offset mes
	int	10h
	pop	es
endm

	.code
	

begin:

	mov 		ax,@data		
	mov 		ds,ax

eshe:
	clrscr

	outmes1		mes1,len1
	outmes1		mes2,len2
	outmes1		mes3,len3
		

again:
	delay		3000

	mov		ah, 06h		;нoмep функции DOS
	mov		dl, 0FFH	;зaпpoc ввoдa c клaвиaтуpы
	int		21h    
	jz		nenagato
	cmp		al, 1Ah	;CTRL+Z
	je		exit
	cmp		al, 03h	;CTRL+C
	je		ctrlc
	jmp		nenagato

nenagato:
	outchar		sim
	cmp		sim,254
	jne		next
	mov		sim,00h
	;jmp		eshe
next:
	inc		sim
	jmp		again
ctrlc:
	inc		cnt
	cmp		cnt,5
	jne		nenagato
	outchar		sim
	wind		6,0,35,15,45,17,42
	cprint		mes4,len4,36,16,33
	cprint		sim,1,43,16,33
	
	stop
		
exit:
	mov	ah,4ch
	int 21h

end begin
Прога работает идеально. Но есть 1 но, которое препод сразу заметил, а я не поняв задания сделал по своему. По причине не частого посещения универа.
Оказывается, надо делать свой обработчик прерываний.

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

Можно скачать исходник Здесь
И сам exe Здесь

Помогите плиз! Нужно сегодня сдать рабочую прогу! А, то не видать мне зачета!
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Ну, подменить прерывание, в принципе, не сложно. (Получить адрес обработчик прерывания - Int 21h, Ah=35h; установить адрес обработчика прерывания - Int 21h, Ah=25h).
Только я не совсем понял, какое перывание и зачем тебе надо подменять? Чтобы эти несчастные секунды считать, что ли?
XGarik
Сообщения: 10
Зарегистрирован: 20 апр 2006, 12:59

[quote="BBB"]Ну, подменить прерывание, в принципе, не сложно. (Получить адрес обработчик прерывания - Int 21h, Ah=35h]

ПОХОДУ CTRL+C и в обр. подсчитывать количество нажатий и выводить символ, если 5 раз
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

XGarik писал(а):ПОХОДУ CTRL+C и в обр. подсчитывать количество нажатий и выводить символ, если 5 раз
Если CTRL+C, то это, видимо, имееться в виду Int 1B:

Int 1B
KEYBOARD - CONTROL-BREAK HANDLER

Desc: This interrupt is automatically called when INT 09 determines that Control-Break has been pressed

Note: Normally points to a short routine in DOS which sets the Ctrl-C flag, thus invoking INT 23h the next time DOS checks for Ctrl-C.


То есть, видимо примерно так (несколько фрагментов программы)

Код: Выделить всё


  SaveInt  dd  &#40]
Ответить