;USBメモリから起動するとパスワード入力してくださいみたいな画面になって
;永久にパスワード違うよって言われ続けるプログラム
;BIOSによってはESCキーを押すと抜けて次のデバイスから起動します。
;Boot Parameter BlockはUSBメモリに合わせて入れ替えてください。
[bits 16]
jmp init0
nop
;----------------------------------------------------------------------------
;Boot Parameter Block
;----------------------------------------------------------------------------
OEMLabel db "MSDOS5.0"
BytePerSector dw 512
SectorsPerCluser db 8
ReservedSectors dw 1094
NumberFATs db 2
MaxRootEntries dw 0
NumberSectors dw 0
MediaDescriptor db 0xf8
SectorsPerFAT dw 0
SectorsPerTrack dw 63
NumberHeads dw 255
HiddenSectors dd 0
LargeSectors dd 7843840
FatSize32 dd 7645
ExtFlags dw 0
VolVer dw 0
RootClus dd 2
FSInfo dw 1
BkSec dw 6
Reserved2_1 dd 0
Reserved2_2 dd 0
Reserved2_3 dd 0
DriveNumber db 0x80
Reserved1 db 0
BootSignature db 0x29
VolumeID dd 0xba01b5f7
VolumeLabel db "NO NAME "
FileSystemLabel db "FAT32 "
;----------------------------------------------------------------------------
init0:
jmp 07C0h:init
init:
;初期化処理
cli ;割り込みを無効化
;int 1Ch (タイマー)割り込みベクタに登録
xor ax,ax
mov ds,ax ;割り込みベクタにセグメント0で値を書き込むために必要
;割り込みベクタの内容を後に復元するために保存しておく DELLのPCだとこうしないとうまく動かなかったため。
mov bx,WORD [1Ch*4]
mov cx,WORD [1Ch*4+2]
mov WORD [1Ch*4],funccall ;割り込みハンドラ funccall のオフセットアドレスを割り込みベクタにセット
mov WORD [1Ch*4+2],07C0h ;割り込みハンドラ funccall のセグメントアドレスを割り込みベクタにセット
mov ax,07C0h ;セグメントの初期化
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0xFFF0 ;スタックポインタを0xFFF0に設定
mov [bk1],bx
mov [bk2],cx
sti ;割り込みを有効に
;画面に文字を出力
mov si,msg1
call putstr
jmp start
;------------------------------------------
; al レジスタの値を画面に出力
;------------------------------------------
putc:
push bx
mov ah, 0Eh
mov bx, 0
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
;------------------------------------------
; カーソルをputc_lineに移動させてputc_strの値を画面に出力
;------------------------------------------
putc_str db 0
putc_line db 0
putc_:
pusha
;カーソル位置を取得
mov ah, 03h
mov bx, 0
int 10h
push dx
;カーソル位置を設定
mov dl,[putc_line]
mov ah, 02h
mov bx, 0
int 10h
mov al,[putc_str]
mov ah, 0Ah
mov bx, 0
mov cx,1
int 10h
pop dx
mov ah, 02h
mov bx, 0
int 10h
popa
ret
;------------------------------------------
;一秒ウエイト
;------------------------------------------
;weight:
; pusha ;全レジスタのスタック待避
; mov ah,0x02
; int 1Ah
; mov al,dh
;weightStart:
; push ax
; mov ah,0x02
; int 1Ah
; pop ax
; cmp al,dh
; jne weightEnd
; jmp weightStart
;weightEnd:
; popa ;全レジスタのスタック復帰
;ret
;------------------------------------------
;タイマー割り込みハンドラ 文字をくるくる回す動きをするだけのため
;------------------------------------------
pos db 0
funccall:
pusha
mov al,[pos]
cmp al,0
je funccall_case2
cmp al,1
je funccall_case3
cmp al,2
je funccall_case4
jmp funccall_case1
funccall_case1:
mov al,0
mov [pos],al
mov al,'|'
mov [putc_str],al
call putc_
jmp funccall_end
funccall_case2:
mov al,1
mov [pos],al
mov al,'/'
mov [putc_str],al
call putc_
jmp funccall_end
funccall_case3:
mov al,2
mov [pos],al
mov al,'-'
mov [putc_str],al
call putc_
jmp funccall_end
funccall_case4:
mov al,3
mov [pos],al
mov al,'\'
mov [putc_str],al
call putc_
funccall_end:
popa
IRET
;------------------------------------------
start:
mov al, '-'
call putc
mov al, '>'
call putc
loop1:
call getc
cmp al,13 ;Enterキーでループを抜ける
je loop1_end
cmp al,0x1B ;ESCキーが押されたら終了
je end
call putc
jmp loop1
loop1_end:
mov si,crlf
call putstr
mov si,msg2
call putstr
jmp start
end:
mov si,crlf
call putstr
mov si,msg3
call putstr
;割り込みベクタを復元する
cli ;割り込みを無効化
mov bx,[bk1]
mov cx,[bk2]
xor ax,ax
mov ds,ax ;割り込みベクタにセグメント0で値を書き込むために必要
mov WORD [1Ch*4],bx
mov WORD [1Ch*4+2],cx
sti ;割り込みを有効に
int 19h ;ブートストラップ処理
jmp 07C0h:0 ;終了 loaderの在るメモリにジャンプ
msg1 db "Please enter the password",0x0d,0x0a,0
msg2 db "ERROR : Incorrect Password",0x0d,0x0a,0
msg3 db "OK",0x0d,0x0a,0
crlf db 0x0d,0x0a,0
bk1 dw 0
bk2 dw 0
; string times 100 db 0 ;100バイトまで0で埋める
times 510-($-$$) db 0
dw 0AA55h
▲トップページ
>
プログラミングの実験
>
OSなしで実行できるプログラム