8086彙編 開機啓動程序(裸機運行)

程序功能:將特定功能的指令寫到軟盤第一扇區,開機cpu執行軟盤裏面的指令

實現

 

1:啓動硬盤系統、硬盤第一扇區

2:重啓計算機、

3:顯示系統時間、

4:修改系統時間。

 

要是想要實現裸機加載運行的話,得使用U盤啓動工具,另外寫一個程序將下面的代碼寫到U盤的引導位置

 

 

 

 

assume cs:code

code segment

get_input:
	push bx
	push es
	push ax

	mov ax,0b800h
	mov es,ax

gi_s:
	mov ah,4
	call my_boot

	mov ah,0
	int 16h

        cmp ah,3bh     ;-input is f1
        jne next0
        call change_color
next0:
	cmp ah,02H  ;--input is 1
	jne next1

	mov ah,0
	call my_boot
	jmp gi_s 
next1:  
	cmp ah,03H  ;--input is 2
	jne next2

	mov ah,1
	call my_boot
	jmp gi_s 
next2:  
	cmp ah,04H  ;--input is 3
	jne next3

	mov ah,2
	call my_boot
        jmp gi_s
next3:  
	cmp ah,05H  ;--input is 4
	jne next4

	mov ah,3
	call my_boot
	jmp gi_s 
next4:
	jmp gi_s
	
	pop es
	pop bx
	pop ax
	ret

;--------------------------------
my_boot:
	jmp short mb_s

	table dw reset_pc,star_system,clock,set_clock,show_menu 

mb_s:
	push ax
	push bx
	push cx
	cmp ah,4
	ja ss_end0
	mov bl,ah
	mov bh,0
	add bx,bx
	call clear_screen
	jmp word ptr table[bx]

;;--------------------------顯示menu
show_menu:
	jmp short sm_start
	m1:db "1.reset pc",0
	m2:db "2.star_system",0
	m3:db "3.show clock",0
	m4:db "4.set clock",0
sm_start:
 	mov bx,160*5+64
	mov di,0
	mov si,offset m1
	mov cx,4
sm1:	push cx

sm2:
	mov cl,cs:[si]
	jcxz sm_ok1
	mov byte ptr es:[bx+di],cl
	inc si
	add di,2
	jmp sm2
sm_ok1:	
	inc si
	mov di,0
	add bx,160*3
	pop cx
loop sm1
	jmp mb_end
;--------------------------------
reset_pc:		;---------------------重啓電腦

        mov ax,0ffffh
        push ax
        mov ax,0
        push ax
        retf
ss_end0: jmp mb_end

;--------------------------------
star_system:	;---------------------引導現有操作系統
        mov ax,0
        mov es,ax
        mov bx,7c00h

        mov al,1
        mov ch,0
        mov cl,1
        mov dh,0
        mov dl,80h

        mov ah,2
        int 13h

        mov ax,0
        push ax
        mov ax,7c00h
        push ax
        retf

;-------------------------------
clock:			;---------------------進入時鐘程序
 	
sc1:
	in al,60h
        cmp al,1
        je c_end

        cmp al,3bh     ;-input is f1
        jne next_c
        call change_color

next_c:
	call show_peice
	jmp sc1
c_end:
	jmp mb_end
;--------------------------------
set_clock:	;---------------------設置時間
 
	jmp short set_start

	now_pos db 0,1,15,2,3,15,4,5,15,6,7,15,8,9,15,10,11   
	port_pos db 9,9,8,8,7,7,4,4,2,2,0,0		
set_start:

 	mov dx,0
        or byte ptr es:[160*12+32*2+1],40h
ss1:	
	in al,60h
        cmp al,1
	je mb_end

        cmp al,3bh     ;-input is f1
        jne next_sc
        call change_color

next_sc:
	call myfunc
	call show_peice
	jmp ss1	
	 
mb_end:	
	mov ax,40h
	mov ds,ax
back0:
	mov ax,ds:[1ch]
	cmp ds:[1ah],ax
	je back1
        mov ah,0
	int 16h
	jmp back0
back1: 
	pop cx
	pop bx
	pop ax
	ret
;-----------------------左4B   右4D
myfunc:
	push si
	push cx
	push ax
	push bx

	;in al,60h
	;cmp al,1
	;jne  nst1
	
nst1:
	cmp al,11
	ja  mov_zy
	jmp change_time

mov_zy:
	cmp al,4Dh	;----right
	jne  nst2
	mov bx,dx
	
	cmp bx,16
	je nst2
	add bx,bx
        and byte ptr es:[bx+1+160*12+32*2],0fh
	add  dx,1
        or byte ptr es:[bx+3+160*12+32*2],40h

nst2:

	cmp al,4bh	;----left
	jne  nst3
	mov bx,dx
	
	cmp bx,0
	je nst3

	add bx,bx
        and byte ptr es:[bx+1+160*12+32*2],0fh
	sub  dx,1
        or  byte ptr es:[bx-1+160*12+32*2],40h
nst3:
	jmp st_out
change_time:
	cmp al,11
	jne  alnot_0
	mov al,1

alnot_0:
	sub al,1
	mov bx,dx
	mov si,bx
	add si,si

	cmp byte ptr es:[si+160*12+32*2],39h
	ja st_out	
	cmp  byte ptr es:[si+160*12+32*2],30h
	jb st_out

	mov ch,al
	cmp byte ptr now_pos[bx+1],15
	je in_low	;--if next now_pos is 15,is changing low_pos 

	mov ah,es:[si+160*12+32*2+2]
	and ah,0Fh
	mov cl,4
	shl ch,cl
	jmp s_deal
in_low:
	mov ah,es:[si+160*12+32*2-2]
	mov cl,4
	shl ah,cl
s_deal:
	or ah,ch	
	mov bl, now_pos[bx]
	mov al, port_pos[bx]
	out 70h,al
	mov al,ah
	out 71h,al

st_out:	
	mov al,0d2h
	out 64h,al
	out 60h,al

	pop bx
	pop ax
	pop cx
	pop si
ret
;--------------------------------
show_peice:	;------------------show current time
	push cx
	push ax
	jmp short sc_start
	clock_p db 9,8,7,4,2,0
	clock_t db '  /  /     :  :  '
sc_start:
	mov byte ptr es:[160*12+31*2],'0'
	mov byte ptr es:[160*12+30*2],'2'
	mov di,0
	mov si,0
	mov cx,6
sc2:	push cx
 	mov al,clock_p[si] 
	out 70h,al
	in al,71h
	mov ah,al

	mov cl,4
	shr ah,cl
	and al,0fh

	add ah,30h
	add al,30h
	mov byte ptr clock_t[di],ah
	mov byte ptr clock_t[di+1],al
 	
	add di,3
	inc si
	pop cx
loop sc2

	mov di,0
	mov si,160*12+32*2
	mov ah,10
	mov cx,17
sc3:	
	mov al,clock_t[di]
	mov byte ptr es:[si],al
	inc di
	add si,2
loop sc3

	pop ax
	pop cx
	ret
;--------------------------------
clear_screen:	;--清屏
	push cx
	push bx
	mov bx,0
	mov cx,2000

clear_s1:	
	mov byte ptr es:[bx],' '
        and byte ptr es:[bx+1],0fh
	add bx,2
	loop clear_s1
	pop bx
	pop cx
        ret

change_color:
	push cx
	push bx
	mov bx,0
	mov cx,2000
cc1:        
        inc byte ptr es:[bx+1]
        and byte ptr es:[bx+1],0fh
        add bx,2
        loop cc1
	pop bx
	pop cx
	ret
all_end:nop


start:
        push cs      ;copy a function to section 1
        pop  es
        mov bx,offset copy_start
       
        mov al,1
        mov ch,0
        mov cl,1
        mov dh,0
        mov dl,0

        mov ah,3
        int 13h

       ;call get_input   ;------------do not use

        mov bx,0
       
        mov al,2
        mov ch,0
        mov cl,2
        mov dh,0
        mov dl,0

        mov ah,3
        int 13h

p_end:	mov ax,4c00h
	int 21h
copy_start:
        mov ax,7c00h
        mov es,ax
        mov bx, 0

        mov al,2
        mov ch,0
        mov cl,2
        mov dh,0
        mov dl,0

        mov ah,2
        int 13h

        mov ax,7c00h
        push ax
        mov ax,0
        push ax
        retf
copy_end:nop
		;----------------------開始引導
code ends
end start
	


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章