;------------------------------------------------------------------------------
;ファンクションコールを作成し、実行するプログラム
;
;文字を表示するだけの割り込みハンドラを作成し、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なしで実行できるプログラム