トップ->アセンブラ入門

あなたは

人目のアセンブラの受講生です。

アセンブラ入門内検索

目次
アセンブラトップ
0. はじめに

1. 基礎
   1. レジスタとは
   2. セグメントとは

2. MOV命令
   1. MOV命令
   2. コンパイル
   3. 即値の転送
   4. メモリーへの転送
   5. データ定義疑似命令
   6. 練習問題

3. 算術演算
   1. 符号なし演算と符号付き演算
   2. 足し算
   3. 練習問題
   4. フラグ
   5. 引き算
   6. かけ算
   7. わり算
   8. INC,DEC

4. 分岐
   1. 無条件分離
   2. 比較命令
   3. 条件分離
   4. 練習問題
   5. ループ
   6. サブルーチン
   7. スタックとは
   8. PUSH,POP
   9. 練習問題

5. 論理演算
   1. AND命令
   2. OR命令
   3. XOR命令
   4. NOT命令
   5. NEG命令
   6. TEST命令
   7. 練習問題

6. シフト演算
   1. シフト
   2. ローテート
   3. 練習問題1
   4. 練習問題2

7. ストリング命令
   1. ストリング命令とは
   2. MOVS?
   3. REP
   4. DFの設定
   5. LODS?
   6. STOS?
   7. SCAS?
   8. CMPS?
   9 .練習問題

8. 入出力
   1. 概要
   2. IN命令
   3. OUT命令
   4. INS,OUTS命令

9. その他
   1. LEA
   2. XCHG
   3. NOP

10. 割り込み
   1. 割り込みとは
   2. ソフトウェア割り込み
   3. ハードウェア割り込み
   4. 割り込みベクター
   5. 割り込み処理の作り方
   6. 練習問題

11. レジスタの型変換(キャスト)

12. 卒業試験
   1. 卒業試験
   2. 画像データの格納形式
   3. インラインアセンブラ
   4. ネガポジ反転
   5. 明るくする、暗くする
   6. グレースケール
   7. 二値化
   8. 上下反転、左右反転
   9. 4分割
   10. モザイク
   11. シャープ
   12. ぼかし
   13. エンボス
   14. ディザ拡散
   15. 鉛筆を置いてください

13. 終わりに

文字コード

アセンブラ 〜MS-DOSの世界〜


・ このページの先頭に戻る
・ トップページに戻る



・ このページの先頭に戻る
・ トップページに戻る

トップ-> アセンブラ入門:10章.割り込み-> 10-5.割り込み処理の作り方

←前ページへ :  トップへ :  次ページへ→



  では、除算エラーのエラーメッセージを変えてみよう。Windows98のコマンドプロンプトから 0で割るプログラムを実行すると下のようになる。

  このメッセージを変えてみるプログラム2つを下記に示した。上は、MS-DOSのシステムコール を用いて割り込みベクタの取得、設定を行っている。下は、システムコールを使わずに、 割り込みベクタの取得、設定を行っている。
CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	.186
	ORG	100h

START:
	mov	ax,3500h
	int	21h		;割り込みベクタ取得
	mov	VECT0_SEG,es
	mov	VECT0_OFF,bx	;割り込みベクタ保管

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

	xor	ax,ax
	div	al		;0で割ってみる

	mov	ah,9
	mov	dx,offset MSG
	int	21h		;メッセージ表示
	mov	ax,2500h
	mov	dx,VECT0_OFF
	mov	ds,VECT0_SEG
	int	21h		;割り込みベクタを戻す

	mov	ax,4c00h
	int	21h		;終了
;-------------------------------------
VECT0:
	cli			;割り込み禁止
;	push	ax		;※注参照
	push	dx		;レジスタ保管
	push	ds		;レジスタ保管

	push	cs
	pop	ds
	mov	ah,9
	mov	dx,offset INT_MSG
	int	21h		;表示

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

VECT0_SEG	dw	?
VECT0_OFF	dw	?
MSG	db	'ゼロで割っちゃった',0dh,0ah,24h
INT_MSG	db	'割り込み処理中です',0dh,0ah,24h

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

;※	本当ならすべてのレジスタを保管しなくてはならない。
;	普通の割り込みでは割り込みが発生した命令の次の命令のIPが保存されるが、
;	除算エラーの場合、原因となった命令のIPが保存される(80186以上)。
;	したがって割り込み処理が終わると、また除算命令に戻ってしまう。
;	このため、例外処理を無限に繰り返してしまうので、終了しなくなってしまう。
;	AXレジスタを保管しないことで、AXレジスタの内容を変え、エラーが
;	繰り返されないようにするため、わざとAXレジスタは保管しなかった。


CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE .186 ORG 100h START: xor di,di xor ax,ax mov ds,ax mov bx,[di+0] mov es,[di+2] mov VECT0_SEG,es mov VECT0_OFF,bx ;割り込みベクタ保管 cli ;割り込み禁止 mov [di+0],offset VECT0 mov [di+2],cs ;割り込みベクタ設定 sti ;割り込み許可 push cs pop ds xor ax,ax div al ;0で割ってみる mov ah,9 mov dx,offset MSG int 21h ;メッセージ表示 mov dx,VECT0_OFF mov es,VECT0_SEG xor ax,ax mov ds,ax mov [di+0],dx mov [di+2],es ;割り込みベクタを戻す mov ax,4c00h int 21h ;終了 ;------------------------------------- VECT0: cli ;割り込み禁止 ; push ax ;※注参照 push dx ;レジスタ保管 push ds ;レジスタ保管 push cs pop ds mov ah,9 mov dx,offset INT_MSG int 21h ;表示 pop ds pop dx mov al,20h out 20h,al ;割り込みコントローラーに終わりを告げる ; pop ax ;※注参照 sti ;割り込みを許可する iret ;終了 VECT0_SEG dw ? VECT0_OFF dw ? MSG db 'ゼロで割っちゃった',0dh,0ah,24h INT_MSG db '割り込み処理中です',0dh,0ah,24h ENDS END START ; 一部のコンパイラでは、 ;CODE ENDS ; END START ;と記述しなければいけないようです ;※ 本当ならすべてのレジスタを保管しなくてはならない。 ; 普通の割り込みでは割り込みが発生した命令の次の命令のIPが保存されるが、 ; 除算エラーの場合、原因となった命令のIPが保存される(80186以上)。 ; したがって割り込み処理が終わると、また除算命令に戻ってしまう。 ; このため、例外処理を無限に繰り返してしまうので、終了しなくなってしまう。 ; AXレジスタを保管しないことで、AXレジスタの内容を変え、エラーが ; 繰り返されないようにするため、わざとAXレジスタは保管しなかった。


←前ページへ :  トップへ :  次ページへ→