;------------------------------------------------------------------------------
;ファンクションコールを作成し、実行するプログラム
;
;文字を表示するだけの割り込みハンドラを作成し、int 21h として割り込みベクタに登録します
;その後、int 21h が連続してコールされ、funccall という文字が画面上に連続して表示されます
;------------------------------------------------------------------------------

[bits 16]

	jmp 07C0h:init ;アドレス 07C0h にコードセグメントを設定してジャンプ

;------------------------------------------ 
;割り込みハンドラ
;------------------------------------------ 
funccall:
	;画面に文字を出力
	mov     si,msg
	call    putstr

IRET

msg db "funccall ",10,13,00h
;------------------------------------------ 

init:
	;初期化処理
	cli		;割り込みを無効化

	;int 21h ファンクションコールを割り込みベクタに登録
	xor	ax,ax
	mov	ds,ax			;割り込みベクタにセグメント0で値を書き込むために必要
	mov	WORD [21h*4],funccall	;割り込みハンドラ funccall のオフセットアドレスを割り込みベクタにセット
	mov	[21h*4+2],cs		;割り込みハンドラ funccall のセグメントアドレスを割り込みベクタにセット

	mov ax,cs	;セグメントの初期化
	mov ds,ax
	mov es,ax
	mov ss,ax
	mov sp,0xFFF0	;スタックポインタを0xFFF0に設定 

	sti		;割り込みを有効に



start:

	int 21h

	jmp start
end:
        
;------------------------------------------     
; al レジスタの値を画面に出力
;------------------------------------------     
putc: 
	push bx
	mov ah, 0Eh 
	mov bx, 7 
	int 10h
	pop bx
	ret 

;------------------------------------------ 
;文字列を画面に出力
;mov     si,string
;call    putstr
;string    db      "testTest"
;------------------------------------------
putstr:
	pusha	;全レジスタのスタック待避
putstrloop:
	lodsb
	cmp al,0
	je putstrend
	call putc
	jmp     putstrloop
putstrend:
	popa	;全レジスタのスタック復帰
	ret


;------------------------------------------ 
;MBRとして起動するために必要

	times 510-($-$$) db 0		;510バイトまで0で埋める
	dw 0AA55h			;MBRをMBRたらしめるマジックナンバーを書き込む



▲トップページ > プログラミングの実験 > OSなしで実行できるプログラム