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