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

[bits 16]

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

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

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

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

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

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

	sti		;割り込みを有効に



start:
	;画面に文字を出力
	mov     si,msg2
	call    putstr

	int 40h

	jmp start
end:
msg2 db "test",10,13,00h
;------------------------------------------     
; 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なしで実行できるプログラム