←練習問題へ :  INDEX :  次ページへ→


10-6.練習問題

問題
約0.99秒ごとに、'*'を1つずつ表示するプログラムを作れ。ただし、リターンキーが押されたら終了する。
ヒント
  • DOS/V機では約55msに1回、割り込み番号8番がタイマー割り込みとして呼び出される。約0.99秒ということは18回呼び出されるたびに'*'を表示すればよい。
  • キーボードからの入力には、CTRL+Cを押されたら終了されては困る。何か押されるまで待ってもらっては困る。この場合はAH=6、DL=FFhの状態で「INT 21h」を実行する。もし何も入力されていなければAL=0、入力されればALに入力文字が返ってくる。


解答

CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	.186
	ORG	100h

START:
	mov	ax,3508h
	int	21h		;割り込みベクタ取得
	mov	VECT8_SEG,es
	mov	VECT8_OFF,bx	;割り込みベクタ保管

	push	cs
	pop	ds		;DS <= CS
	mov	dx,offset VECT8
	mov	ax,2508h
	int	21h		;割り込みベクタ設定

MAIN:
	mov	ah,6
	mov	dl,0ffh
	int	21h		;入力
	cmp	al,0dh
	jz	QUIT		;リターンキーだったら終了
	cmp	COUNT,18
	jnz	MAIN
	mov	ah,6
	mov	dl,'*'
	int	21h
	mov	COUNT,0
	jmp	short MAIN

QUIT:
	mov	ax,2508h
	mov	dx,VECT8_OFF
	mov	ds,VECT8_SEG
	int	21h		;割り込みベクタを戻す

	mov	ax,4c00h
	int	21h		;終了
;-------------------------------------
VECT8:
	cli			;割り込み禁止
	push	ax		;レジスタ保管

	inc	cs:COUNT

	mov	al,20h
	out	20h,al		;割り込みコントローラーに終わりを告げる
	pop	ax		;
	sti			;割り込みを許可する
	iret			;終了

VECT8_SEG	dw	?
VECT8_OFF	dw	?
COUNT		db	0

	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです

←練習問題へ :  INDEX :  次ページへ→