[bits 16]
jmp 07C0h:init ;アドレス 07C0h にジャンプ。ロード・順次実行が行われる
init:
;初期化処理
cli ;割り込みを無効化
mov ax,07C0h ;セグメントの初期化
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0xFFF0 ;スタックポインタを0xFFF0に設定
sti ;割り込みを有効に
;レジスタやメモリの内容を参照するときには [test] のようにする
;何もつけないとアドレス参照になる
;画面に文字を出力
mov si,msg1
call putstr
;バッファに文字を入れる-------------------------------------
mov di,string;現在のアドレスをdiに入れる
pusha ;全レジスタのスタック待避
mov al,byte 'H' ;メモリに文字(数字)を入れる
stosb ;[di++]=al ;alの文字をバッファに入れて、diのポインタを一つ上げる
mov al,byte 'e'
stosb
mov al,byte 'l'
stosb
mov al,byte 'l'
stosb
mov al,byte 'o'
stosb
mov al,byte 10;CR
stosb
mov al,byte 13;LF
stosb
mov al,byte 0;終端
stosb
popa ;全レジスタのスタック復帰
;-----------------------------------------------------
;画面に文字を出力
mov si,string
call putstr
jmp start
;------------------------------------------
; al レジスタの値を画面に出力
;------------------------------------------
putc:
push bx
mov ah, 0Eh
mov bx, 7
int 10h
pop bx
ret
;------------------------------------------
; al レジスタに一文字の文字入力
;------------------------------------------
getc:
push bx
mov ah, 00h
int 16h
pop bx
ret
;------------------------------------------
;al レジスタの文字から数字に
;------------------------------------------
atoi:
sub al,48
cmp al,0
jb atoiErr
cmp al,9
ja atoiErr
jmp atoiEnd
atoiErr:
mov al,0
atoiEnd:
ret
;------------------------------------------
;al レジスタの数字から文字に
;------------------------------------------
itoa:
add al,48
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
;------------------------------------------
;di のバッファに入力文字列を格納
;------------------------------------------
bufferInput:
pusha ;全レジスタのスタック待避
bufferInputStart:
call getc
cmp al,13 ;Enterキーで終了
je bufferInputEnd
call putc
stosb
jmp bufferInputStart
bufferInputEnd:
mov al,byte 0
stosb
popa ;全レジスタのスタック復帰
ret
;------------------------------------------
;メッセージ表示
print:
lodsb
cmp al,0
je printend
mov ah,0Eh
mov bx,7
int 10h
jmp print
printend:
ret
start:
mov al, '?'
call putc
mov al, '>'
call putc
mov di,string
call bufferInput
mov al, '-'
call putc
mov al, '>'
call putc
mov si,string
call putstr
mov al,10 ;CR
call putc
mov al,13 ;LF
call putc
mov al,[string]
cmp al,0x1B ;ESCキーが押されたら終了
je end
jmp start
end:
jmp 07C0h:0 ;終了 loaderの在るメモリにジャンプ
msg1 db "start "
db 0x00 ;文字列がつながってしまわないように0を入れる
string times 100 db 0 ;100バイトまで0で埋める
;MBRとして起動するために必要
times 510-($-$$) db 0 ;510バイトまで0で埋める
dw 0AA55h ;MBRをMBRたらしめるマジックナンバーを書き込む
; ; al の回数ループする
; mov ah,0
; mov cx,ax
; call itoa
; cmp cl,0
; je LOOPEND
; LOOPSTART:
; ;ループ
; loop LOOPSTART
; LOOPEND:
▲トップページ
>
プログラミングの実験
>
OSなしで実行できるプログラム