8086汇编 开机启动程序(裸机运行)

来源:互联网 发布:商城数据库表结构 编辑:程序博客网 时间:2024/06/04 18:10

程序功能:将特定功能的指令写到软盘第一扇区,开机cpu执行软盘里面的指令

实现

 

1:启动硬盘系统、硬盘第一扇区

2:重启计算机、

3:显示系统时间、

4:修改系统时间。

 

要是想要实现裸机加载运行的话,得使用U盘启动工具,另外写一个程序将下面的代码写到U盘的引导位置

 

 

 

 

assume cs:codecode segmentget_input:push bxpush espush axmov ax,0b800hmov es,axgi_s:mov ah,4call my_bootmov ah,0int 16h        cmp ah,3bh     ;-input is f1        jne next0        call change_colornext0:cmp ah,02H  ;--input is 1jne next1mov ah,0call my_bootjmp gi_s next1:  cmp ah,03H  ;--input is 2jne next2mov ah,1call my_bootjmp gi_s next2:  cmp ah,04H  ;--input is 3jne next3mov ah,2call my_boot        jmp gi_snext3:  cmp ah,05H  ;--input is 4jne next4mov ah,3call my_bootjmp gi_s next4:jmp gi_spop espop bxpop axret;--------------------------------my_boot:jmp short mb_stable dw reset_pc,star_system,clock,set_clock,show_menu mb_s:push axpush bxpush cxcmp ah,4ja ss_end0mov bl,ahmov bh,0add bx,bxcall clear_screenjmp word ptr table[bx];;--------------------------显示menushow_menu:jmp short sm_startm1:db "1.reset pc",0m2:db "2.star_system",0m3:db "3.show clock",0m4:db "4.set clock",0sm_start: mov bx,160*5+64mov di,0mov si,offset m1mov cx,4sm1:push cxsm2:mov cl,cs:[si]jcxz sm_ok1mov byte ptr es:[bx+di],clinc siadd di,2jmp sm2sm_ok1:inc simov di,0add bx,160*3pop cxloop sm1jmp mb_end;--------------------------------reset_pc:;---------------------重启电脑        mov ax,0ffffh        push ax        mov ax,0        push ax        retfss_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_colornext_c:call show_peicejmp sc1c_end:jmp mb_end;--------------------------------set_clock:;---------------------设置时间 jmp short set_startnow_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,0set_start: mov dx,0        or byte ptr es:[160*12+32*2+1],40hss1:in al,60h        cmp al,1je mb_end        cmp al,3bh     ;-input is f1        jne next_sc        call change_colornext_sc:call myfunccall show_peicejmp ss1 mb_end:mov ax,40hmov ds,axback0:mov ax,ds:[1ch]cmp ds:[1ah],axje back1        mov ah,0int 16hjmp back0back1: pop cxpop bxpop axret;-----------------------左4B   右4Dmyfunc:push sipush cxpush axpush bx;in al,60h;cmp al,1;jne  nst1nst1:cmp al,11ja  mov_zyjmp change_timemov_zy:cmp al,4Dh;----rightjne  nst2mov bx,dxcmp bx,16je nst2add bx,bx        and byte ptr es:[bx+1+160*12+32*2],0fhadd  dx,1        or byte ptr es:[bx+3+160*12+32*2],40hnst2:cmp al,4bh;----leftjne  nst3mov bx,dxcmp bx,0je nst3add bx,bx        and byte ptr es:[bx+1+160*12+32*2],0fhsub  dx,1        or  byte ptr es:[bx-1+160*12+32*2],40hnst3:jmp st_outchange_time:cmp al,11jne  alnot_0mov al,1alnot_0:sub al,1mov bx,dxmov si,bxadd si,sicmp byte ptr es:[si+160*12+32*2],39hja st_outcmp  byte ptr es:[si+160*12+32*2],30hjb st_outmov ch,alcmp byte ptr now_pos[bx+1],15je in_low;--if next now_pos is 15,is changing low_pos mov ah,es:[si+160*12+32*2+2]and ah,0Fhmov cl,4shl ch,cljmp s_dealin_low:mov ah,es:[si+160*12+32*2-2]mov cl,4shl ah,cls_deal:or ah,chmov bl, now_pos[bx]mov al, port_pos[bx]out 70h,almov al,ahout 71h,alst_out:mov al,0d2hout 64h,alout 60h,alpop bxpop axpop cxpop siret;--------------------------------show_peice:;------------------show current timepush cxpush axjmp short sc_startclock_p db 9,8,7,4,2,0clock_t db '  /  /     :  :  'sc_start:mov byte ptr es:[160*12+31*2],'0'mov byte ptr es:[160*12+30*2],'2'mov di,0mov si,0mov cx,6sc2:push cx mov al,clock_p[si] out 70h,alin al,71hmov ah,almov cl,4shr ah,cland al,0fhadd ah,30hadd al,30hmov byte ptr clock_t[di],ahmov byte ptr clock_t[di+1],al add di,3inc sipop cxloop sc2mov di,0mov si,160*12+32*2mov ah,10mov cx,17sc3:mov al,clock_t[di]mov byte ptr es:[si],alinc diadd si,2loop sc3pop axpop cxret;--------------------------------clear_screen:;--清屏push cxpush bxmov bx,0mov cx,2000clear_s1:mov byte ptr es:[bx],' '        and byte ptr es:[bx+1],0fhadd bx,2loop clear_s1pop bxpop cx        retchange_color:push cxpush bxmov bx,0mov cx,2000cc1:                inc byte ptr es:[bx+1]        and byte ptr es:[bx+1],0fh        add bx,2        loop cc1pop bxpop cxretall_end:nopstart:        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 13hp_end:mov ax,4c00hint 21hcopy_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        retfcopy_end:nop;----------------------开始引导code endsend start


 

原创粉丝点击