;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なしで実行できるプログラム