[093][匯編語(yǔ)言]課程設(shè)計(jì)2 :(8)選項(xiàng)全部功能化类溢,選項(xiàng)1) 重啟計(jì)算機(jī)、選項(xiàng)2)引導(dǎo)現(xiàn)有操作系統(tǒng)(測(cè)試版)

前文

[085][匯編語(yǔ)言]課程設(shè)計(jì)2 :(1)從軟盤(pán)啟動(dòng)莺掠,開(kāi)機(jī)后主界面衫嵌,列出選項(xiàng)
http://www.reibang.com/p/0a99d34113c0
[086][匯編語(yǔ)言]課程設(shè)計(jì)2 :(2)從軟盤(pán)啟動(dòng),功能化選項(xiàng)按鍵 "1"(測(cè)試版)
http://www.reibang.com/p/bfe3c83359e8
[087][匯編語(yǔ)言]課程設(shè)計(jì)2 :(3)從軟盤(pán)啟動(dòng)彻秆,功能化選項(xiàng)按鍵 "3"楔绞,F(xiàn)1鍵改顯示顏色、ESC鍵返回主選單(測(cè)試版)
http://www.reibang.com/p/6adb66c62b81
[088][匯編語(yǔ)言]課程設(shè)計(jì)2 :(4)動(dòng)態(tài)顯示當(dāng)前時(shí)間(動(dòng)態(tài)時(shí)鐘) F1鍵改顯示顏色 ESC鍵返回(測(cè)試版)
http://www.reibang.com/p/f470d973de1e
[090][匯編語(yǔ)言]課程設(shè)計(jì)2 :(5)進(jìn)入選項(xiàng)4唇兑,輸入字符串酒朵,同步顯示(測(cè)試版)
http://www.reibang.com/p/f9df61506e7b
[091][匯編語(yǔ)言]課程設(shè)計(jì)2 :(6)完成選項(xiàng)4功能,可以對(duì)系統(tǒng)時(shí)間進(jìn)行修改(測(cè)試版)
http://www.reibang.com/p/ec89cb845fcf
[092][匯編語(yǔ)言]課程設(shè)計(jì)2 :(7)選項(xiàng)4)扎附,對(duì)時(shí)間輸入增加提示符(測(cè)試版)
http://www.reibang.com/p/8b88f6dcfe72

課程設(shè)計(jì)2 :(8)功能化蔫耽,選項(xiàng)1) 重啟計(jì)算機(jī)、選項(xiàng)2)引導(dǎo)現(xiàn)有操作系統(tǒng)(測(cè)試版)

  • 新增:實(shí)現(xiàn)功能留夜,選項(xiàng)1) 重新啟動(dòng)計(jì)算機(jī)匙铡,
  • 新增:實(shí)現(xiàn)功能,選項(xiàng) 2)引導(dǎo)現(xiàn)有操作系統(tǒng)
    目前全部選項(xiàng)都實(shí)現(xiàn)功能化了碍粥,書(shū)上對(duì)于 課設(shè)設(shè)計(jì)2 的全部實(shí)驗(yàn)要求都已經(jīng)完成鳖眼,只是源碼文件里還有很多測(cè)試用的代碼,需要進(jìn)行一些代碼清理
測(cè)試選項(xiàng)1)
    在主選單嚼摩,按下按鍵1钦讳,進(jìn)入選項(xiàng)1),
    會(huì)出現(xiàn)VMware重新啟動(dòng)的開(kāi)機(jī)畫(huà)面低斋,代表機(jī)器重新啟動(dòng)成功。

測(cè)試選項(xiàng)2)
    在主選單匪凡,按下按鍵2膊畴,進(jìn)入選項(xiàng)2), 會(huì)對(duì)現(xiàn)有操作系統(tǒng)進(jìn)行引導(dǎo)病游,
    由于我在VMware里面現(xiàn)有的操作系統(tǒng)是虛擬機(jī)XP唇跨,
    所以會(huì)進(jìn)入現(xiàn)有的XP操作系統(tǒng)稠通,那么就會(huì)看到XP的開(kāi)機(jī)啟動(dòng)畫(huà)面。

測(cè)試運(yùn)行

主選單.PNG
主選單 按下按鍵1 會(huì)進(jìn)入選項(xiàng)1)重新啟動(dòng)計(jì)算機(jī) 买猖,這是計(jì)算機(jī)啟動(dòng)畫(huà)面.png
主選單 按下按鍵2 會(huì)進(jìn)入選項(xiàng) 2 改橘,會(huì)引導(dǎo)現(xiàn)有的操作系統(tǒng) ,即玉控,進(jìn)入虛擬機(jī)的XP系統(tǒng).PNG

代碼修改

修改 taskcode.asm 文件中 task 部分

  • 新增:選項(xiàng)1)子程序 resetpc 以及 選項(xiàng)2)子程序 startsystem 調(diào)用入口
key1:   jmp short resetpc
            ;jmp short taskstart
key2:   jmp short startsystem
            ;jmp short taskstart
  • 新增:子程序 resetpc
    ;-------------------------------------------------------------- 
    ;   選項(xiàng) 1)
    ;--------------------------------------------------------------
    ;   子程序:resetpc
    ;   功能: 重新啟動(dòng)計(jì)算機(jī)
    ;--------------------------------------------------------------
    resetpc:    ; jmp ffff:0000h
                mov ax,0FFFFH
                push ax
                mov ax,0
                push ax
                retf        ; pop IP pop cs
  • 新增:選項(xiàng)2)子程序 startsystem
    ;-------------------------------------------------------------- 
    ;   選項(xiàng) 2)
    ;-------------------------------------------------------------- 
    ;   子程序:startsystem
    ;   功能: 引導(dǎo)現(xiàn)有的操作系統(tǒng)
    ;   實(shí)現(xiàn): 1.  讀取硬盤(pán)C盤(pán) 0面0道1扇區(qū)的內(nèi)容到 0000:7C00H
    ;           2.  將CS:IP 指向0000:7C00H
    ;-------------------------------------------------------------- 
    startsystem:    call clear_screen
                    mov bx,0
                    mov es,bx
                    mov bx,7C00H

                    mov al,1        ;   扇區(qū)數(shù)
                    mov ch,0        ;   磁道 0
                    mov cl,1        ;   扇區(qū) 1
                    mov dl,80H      ;   硬盤(pán)C: 80H
                    mov dh,0        ;   面 0
                    mov ah,2        ;   讀扇區(qū)
    
                    int 13H
                    
                    ; jmp 0000:7C00H
                    mov bx,0
                    push bx
                    mov bx,7C00H
                    push bx
                    retf        ; POP IP POP CS

完整源碼

bootcode.asm

assume cs:code
data segment
    db 512 dup (0)
data ends
code segment
    start:  mov ax,cs
            mov ds,ax
            mov si, offset boot
            
            mov ax,data
            mov es,ax
            mov di,0
            mov cx,offset bootend - offset boot
            cld
            rep movsb
            
            jmp short write
    boot:   jmp short bootstart
            db 10 dup(0)
    
    
    ; 引導(dǎo)程序 boot 將被安裝到內(nèi)存data開(kāi)始 
    ; 引導(dǎo)程序的功能:  1.讀扇區(qū) 將 任務(wù)程序task 0面0道2扇區(qū) 寫(xiě)到內(nèi)存 0000:7E00H;
    ;                   2.將CS:IP指向 0000:7E00H
    bootstart:
            mov ax,cs
            mov ss,ax
            mov sp,10
            
            mov ax,0
            mov es,ax
            mov bx,7E00H
            
            mov al,2        ; 扇區(qū)數(shù)
            mov ch,0
            mov cl,2
            mov dl,0
            mov dh,0
            mov ah,2
            
            int 13h
            
            mov bx,0
            push bx
            mov bx,7E00H
            push bx
            retf    

    bootend:    nop
    
    write:
    
    ;   利用 int 13H 中斷 
    ;   將內(nèi)存 data 處的引導(dǎo)程序 boot
    ;   寫(xiě)入 軟盤(pán)A 0面 0道 1扇區(qū)
            mov ax,data
            mov es,ax
            mov bx,0
            
            mov al,1        ; 引導(dǎo)扇區(qū)固定只占用1個(gè)扇區(qū) 
            mov ch,0
            mov cl,1
            mov dl,0
            mov dh,0
            mov ah,3
            
            int 13h
            
            mov ax,4c00H
            int 21H
   
    code ends
    end start

taskcode.asm

assume cs:code
data segment
    db 1024 dup (0)
data ends
code segment
    start: 
            call setup
            call write
    
            mov ax,4c00h
            int 21H
    
    setup:
    ;   任務(wù)程序 安裝步驟
    ;   將任務(wù)程序機(jī)器碼安裝到data段開(kāi)辟的內(nèi)存空間
            mov ax,cs
            mov ds,ax
            mov si, offset task
            
            mov ax,data
            mov es,ax
            mov di,0
            mov cx,offset taskend - offset task
            cld
            rep movsb
            ret     
            
            
    write:
        ;   利用 int 13H 中斷 
        ;   將內(nèi)存 data 處的任務(wù)程序
        ;   寫(xiě)入 軟盤(pán)A 0面 0道 2扇區(qū)        
            mov ax,data
            mov es,ax
            mov bx,0
            
            mov al,2    ; 扇區(qū)數(shù)
            mov ch,0
            mov cl,2
            mov dl,0
            mov dh,0
            mov ah,3
            
            int 13h     
            ret
    
    ;-------------------------------------------------------------- 
    ;   任務(wù)程序 開(kāi)始     
    ;   任務(wù)程序 從 標(biāo)號(hào) task 開(kāi)始 到 標(biāo)號(hào) taskend 結(jié)束
    ;--------------------------------------------------------------
    
    task:       jmp short taskstart
                menu_1 db '1) reset pc',0
                menu_2 db '2) start system',0
                menu_3 db '3) clock',0
                menu_4 db '4) set clock',0
                
                menu_address    dw offset menu_1 - offset task + 7E00H
                                dw offset menu_2 - offset task + 7E00H
                                dw offset menu_3 - offset task + 7E00H
                                dw offset menu_4 - offset task + 7E00H
                ;stack db 50 dup(0)
                time db 9,8,7,4,2,0
                blank db '// ::'
                adddata dw 0,0
                aESC    db 0

    taskstart:  
                call init_reg
                call clear_screen
                call toppage
                jmp short key_toppage
                
                
                
                mov ax,4c00h
                int 21H
    ;--------------------------------------------------------------
    ;   選項(xiàng)控制:   key_toppage
    ;   功能: 針對(duì)首頁(yè) toppage 的鍵盤(pán)操作
    ;   實(shí)現(xiàn): 使用 BIOS int 16h 0號(hào)功能飞主,讀取一個(gè)鍵盤(pán)輸入
    ;           返回值 (ah) = 掃描碼 , (al) = ASCII碼
    ;   鍵       1   2   3   4
    ;   掃描碼 02  03  04  05
    ;--------------------------------------------------------------
    key_toppage:    mov ah,0    
                    int 16h
                    
                    cmp ah,02H
                    je key1
                    cmp ah,03h
                    je key2
                    cmp ah,04h
                    je key3
                    cmp ah,05h
                    je key4
                    ; 本意是,這時(shí)候讀取的輸入高诺,如果不是1234就忽略碌识,再讀取一個(gè)
                    jmp short key_toppage
        
    key1:   jmp short resetpc
            ;jmp short taskstart
            
    key2:   jmp short startsystem
            ;jmp short taskstart
            
    key3:   call clock
            jmp short taskstart
            
    key4:   call setclock
            jmp short taskstart
    
    ;-------------------------------------------------------------- 
    ;   選項(xiàng) 1)
    ;--------------------------------------------------------------
    ;   子程序:resetpc
    ;   功能: 重新啟動(dòng)計(jì)算機(jī)
    ;--------------------------------------------------------------
    resetpc:    ; jmp ffff:0000h
                mov ax,0FFFFH
                push ax
                mov ax,0
                push ax
                retf        ; pop IP pop cs
    ;-------------------------------------------------------------- 
    ;   選項(xiàng) 2)
    ;-------------------------------------------------------------- 
    ;   子程序:startsystem
    ;   功能: 引導(dǎo)現(xiàn)有的操作系統(tǒng)
    ;   實(shí)現(xiàn): 1.  讀取硬盤(pán)C盤(pán) 0面0道1扇區(qū)的內(nèi)容到 0000:7C00H
    ;           2.  將CS:IP 指向0000:7C00H
    ;-------------------------------------------------------------- 
    startsystem:    call clear_screen
                    mov bx,0
                    mov es,bx
                    mov bx,7C00H

                    mov al,1        ;   扇區(qū)數(shù)
                    mov ch,0        ;   磁道 0
                    mov cl,1        ;   扇區(qū) 1
                    mov dl,80H      ;   硬盤(pán)C: 80H
                    mov dh,0        ;   面 0
                    mov ah,2        ;   讀扇區(qū)
    
                    int 13H
                    
                    ; jmp 0000:7C00H
                    mov bx,0
                    push bx
                    mov bx,7C00H
                    push bx
                    retf        ; POP IP POP CS
    ;--------------------------------------------------------------
    ;   選項(xiàng) 3)
    ;-------------------------------------------------------------- 
    ;   子程序:clock
    ;   功能: 循環(huán)顯示當(dāng)前時(shí)間
    ;           F1鍵-改變顯示顏色
    ;           ESC鍵-返回到主選單
    ;-------------------------------------------------------------- 
    clock:      call clear_screen
                call clockstart
    ret
    ;-------------------------------------------------------------- 
    ;   子程序:clockstart
    ;   功能: 循環(huán)顯示當(dāng)前時(shí)間
    ;-------------------------------------------------------------- 
    clockstart:  ;ds = 0
                push bx
                push ax
                
                ;   (int 9H)1、將原始的int 9H 入口地址保存到新開(kāi)辟的 adddata 表中虱而,
                ;           以便日后模擬指令的調(diào)用和還原筏餐;
                mov bx,offset adddata - offset task + 7E00H
                
                push ds:[9*4]
                pop ds:[bx]
                push ds:[9*4+2]
                pop ds:[bx+2]
                
                ;   (int 9H)2、設(shè)置新的int 9H 的入口地址牡拇;
                cli         ; TF = 0
                mov word ptr ds:[9*4],offset int9 - offset task + 7E00H
                mov word ptr ds:[9*4+2],cs
                sti         ; TF = 1
                
                
                mov bx,offset aESC - offset task + 7E00H
                mov byte ptr ds:[bx],0
                mov ah,'a'
    dateloop:   call date
                mov al,ds:[bx]
                cmp al,01H
                je clockend
                call delay
                cmp ah,'z'
                jna dateloop
            
    clockend:   ;   (int 9H)5魁瞪、還原原始的int 9H 入口地址;
                mov bx,offset adddata - offset task + 7E00H
                cli         ; TF = 0
                push ds:[bx]
                pop ds:[9*4]
                push ds:[bx+2]
                pop ds:[9*4+2]
                sti         ; TF = 1
        
                pop ax
                pop bx
    ret            
    
    ;--------------------------------------------------------------     
    delay:  push ax
            push dx
            mov dx,0003H
            mov ax,0
        s1: sub ax,1
            sbb dx,0
            cmp ax,0
            jne s1
            cmp dx,0
            jne s1
            pop dx
            pop ax
            ret     
        
    ;-------------------------------------------------------------- 
    int9:   push bx 
            in al,60H
            
            pushf
            pushf
            pop bx
            and bh,11111100B
            push bx
            popf
            
            ;   (int 9H)3惠呼、模擬對(duì)原始 int 9H 指令的調(diào)用导俘;
            mov bx,offset adddata - offset task + 7E00H
            call dword ptr ds:[bx]

            ;   (int 9H)4、編寫(xiě)代碼罢杉,實(shí)現(xiàn)指定按鍵的功能趟畏;
            cmp al,01H  ;   ESC
            jne maybeF1
            mov bx,offset aESC - offset task + 7E00H
            mov ds:[bx],al
    
    maybeF1:    cmp al,3BH  ;   F1
                jne int9ret
                call changcolor
            
                    
    int9ret:    pop bx
                iret
    
    ;-------------------------------------------------------------- 
    ;   子程序:changcolor
    ;   功能: 改變顯示顏色
    ;-------------------------------------------------------------- 
    changcolor:     push cx
                    push bx
                    
                    mov bx,1
                    mov cx,2000
        colors:     inc byte ptr es:[bx]
                    add bx,2
                    loop colors
                    
                    pop bx
                    pop cx
    ret
    ;-------------------------------------------------------------- 
    ;   子程序:date
    ;   功能: 顯示當(dāng)前時(shí)間
    ;-------------------------------------------------------------- 
    date:
                push di
                push si
                push cx
                push ax
    
                mov di,160*12+40*2
                mov si,offset time - offset task + 7E00H
                mov cx,6
    showdate:   push cx
                mov al,[si]
                out 70H,al
                in al,71H
                
                mov ah,al
                mov cl,4
                shr ah,cl
                and al,00001111B
                
                add ah,30H
                add al,30H
                
                mov byte ptr es:[di],ah
                mov byte ptr es:[di+2],al

            
                add di,6
                inc si
                pop cx
                loop showdate
    
                mov di,160*12+40*2
                mov si,offset blank - offset task + 7E00H
                mov cx,5
    showblank:  push cx
                
                mov al,[si]
                mov byte ptr es:[di+4],al
                
                add di,6
                inc si
                pop cx
                loop showblank
    
                
    dateend:    pop ax
                pop cx
                pop si
                pop di
    
    ret
    
    ;-------------------------------------------------------------- 
    ;   選項(xiàng) 4)
    ;-------------------------------------------------------------- 
    ;   子程序:setclock
    ;   功能: 選項(xiàng) 4)的入口
    ;--------------------------------------------------------------
    setclock:   call clear_screen
                call clear_stack
                call blankdraw
                call getstr
                call changeclock
    ret
    ;--------------------------------------------------------------
    ;   子程序:    clear_stack
    ;   功能:     每一次重新進(jìn)入選項(xiàng)4),就清空一次時(shí)間數(shù)據(jù)棧
    ;   實(shí)現(xiàn):     通過(guò)將棧頂偏移量置為0實(shí)現(xiàn)滩租,“清空椄承悖”
    ;--------------------------------------------------------------
    clear_stack:    push di 
                    push bx 
                    
                    mov di,offset top - offset task + 7E00H
                    mov bx,0
                    mov ds:[di],bx
                    
                    pop di
                    pop bx
    ret
    
    ;-------------------------------------------------------------- 
    ;   子程序:blankdraw
    ;   功能: 在屏幕上畫(huà)出' / /   : :  '
    ;           提示用戶輸入時(shí)間
    ;-------------------------------------------------------------- 
    ;            '123456789012' 
    timeblank db ' / /   : :  '
    format    db 'yymmddhhmmss'
    blankdraw:  push bx
                push di 
                push ax
                push cx
                push bp
                    
                ; 閃爍的圖標(biāo)確定輸入位置   
                mov di,160*10+20*2
                mov byte ptr es:[di],'_'
                mov al,11110000B
                mov es:[di+1],al
                
                mov bx,offset timeblank - offset task + 7E00H
                mov bp,offset format - offset task + 7E00H
                mov cx,12
    blankdrawloop:  mov al,ds:[bx]
                    mov es:[di+2],al
                    mov al,03H
                    mov es:[di+3],al
                    
                    mov al,ds:[bp]
                    mov byte ptr es:[di-160],al
                    mov al,04H
                    mov byte ptr es:[di-160+1],al
                    
                    inc bx
                    inc bp
                    add di,4
                    loop blankdrawloop
                pop bp
                pop cx
                pop ax
                pop di
                pop bx
    ret
    ;-------------------------------------------------------------- 
    
    ;--------------------------------------------------------------
    ;   子程序:changeclock
    ;   功能: 修改系統(tǒng)時(shí)間
    ;   實(shí)現(xiàn): 利用CMOS RAM端口70H、71H向?qū)?yīng)單元送入時(shí)間數(shù)據(jù)
    ;--------------------------------------------------------------
    changeclock:    jmp short clockon
                    unit db 9,8,7,4,2,0
                    ;timestack db 13 dup(0) ; 年月日 時(shí)分秒 + 0(最后壓入)
    clockon:        push si
                    push bx
                    push cx
                    push ax

                    mov si,offset timestack - offset task + 7E00H
                    mov bx,offset unit - offset task + 7E00H
                    mov cx,6
                    
    clockonloop:    push cx
                    
                    mov al,ds:[si]
                    sub al,30H
                    mov cl,4
                    shl al,cl
                    mov ah,ds:[si+1]
                    sub ah,30H
                    add ah,al
                    
                    mov al,ds:[bx]  ; 取單元號(hào)
                    out 70H,al
                    mov al,ah       ; 將單元號(hào)送入 CMOS RAM
                    out 71H,al      ; 向指定單元號(hào)寫(xiě)入數(shù)據(jù)
                            
                    inc bx
                    add si,2
                    
                    pop cx
                    loop clockonloop
                    
                    pop ax
                    pop cx
                    pop bx
                    pop si
    ret
    ;--------------------------------------------------------------
    
    ;-------------------------------------------------------------- 
    ; 子程序: 字符串輸入
    ;(1)律想、調(diào)用16H讀取鍵盤(pán)輸入
    ;(2)猎莲、如果是字符,進(jìn)入字符棧技即,顯示字符棧中的所有字符著洼;繼續(xù)執(zhí)行 (1)
    ;(3)、如果是退格鍵而叼,從字符棧中彈出一個(gè)字符身笤,顯示字符棧中的所有字符來(lái),繼續(xù)執(zhí)行(1)
    ;(4)葵陵、如果是enter鍵液荸,向字符棧中壓入一個(gè)0,返回脱篙。
    ;-------------------------------------------------------------- 
    getstr:     push ax
    getstrs:    mov ah,0
                int 16H
                
                cmp al,20H
                jb nochar   ; ASCII碼小于20H娇钱,說(shuō)明不是字符
                mov ah,0
                call charstack ;字符入棧
                mov ah,2
                call charstack ;顯示棧中的字符
                jmp getstrs
                


    nochar:     cmp ah,0eh  ;退格鍵的掃描碼
                je backspace
                cmp ah,1ch  ;Enter鍵的掃描碼
                je enter2
                jmp getstrs
            
            

    backspace:  mov ah,1
                call charstack      ;字符出棧
                mov ah,2    
                call charstack      ;顯示棧中的字符
                jmp getstrs

    enter2:     mov al,0
                mov ah,0
                call charstack      ;0 入棧
                mov ah,2
                call charstack      ;顯示棧中的字符    
                pop ax
                ret

    ;-------------------------------------------------------------- 
    ;   字符棧的入棧伤柄、出棧和顯示
    ;   參數(shù): (ah)=功能號(hào),0表示入棧文搂,1表示出棧适刀,2表示顯示
    ;   ds:si 指向字符棧空間
    ;   對(duì)于0號(hào)功能煤蹭,(al)=入棧字符
    ;   對(duì)于1號(hào)功能笔喉,(al)=返回字符串
    ;   對(duì)于2號(hào)功能,(dh)疯兼、(dl)=字符串在屏幕上顯示的行然遏、列位置
    ;-------------------------------------------------------------- 
    charstack:  jmp short charstart
    table   dw offset charpush - offset task + 7E00H,offset charpop - offset task + 7E00H,offset charshow - offset task + 7E00H
    top     dw 0                            ;棧頂
    timestack db 13 dup(0)  ; 年月日 時(shí)分秒 + 0(最后壓入)
    
    charstart:  push bx
                push dx
                push di
                push es
                push bp
                
                cmp ah,2
                ja sret
                mov bl,ah
                mov bh,0
                add bx,bx        
                mov di,offset table - offset task + 7E00H
                jmp word ptr ds:[di+bx]
                
    ;--------------------------------------------------------------            
    charpush:   mov di,offset top - offset task + 7E00H
                mov bx,ds:[di]
                
                mov si,offset timestack - offset task + 7E00H
                mov ds:[si][bx],al
                
                inc bx
                mov ds:[di],bx          
                jmp sret
    ;-------------------------------------------------------------- 
    charpop:    mov di,offset top - offset task + 7E00H
                mov bx,ds:[di]
                cmp bx,0
                je sret
                dec bx
                mov ds:[di],bx
                
                mov bx,ds:[di]
                mov si,offset timestack - offset task + 7E00H
                mov al,ds:[si][bx]
                jmp sret
    ;-------------------------------------------------------------- 
    charshow:   mov di,160*10+20*2
                
                
                mov bx,0
    charshows:  mov bp,offset top - offset task + 7E00H
                cmp bx,ds:[bp]
                jne noempty
                mov byte ptr es:[di],' '
                jmp sret
    noempty:    mov si,offset timestack - offset task + 7E00H
                mov al,ds:[si][bx] ; bx = 0 表示棧底
                
                mov es:[di],al
                mov al,02H
                mov es:[di+1],al ; 設(shè)置顏色屬性 為綠色
                mov byte ptr es:[di+4],'_'
                mov al,11110000B
                mov byte ptr es:[di+5],al
                
                
                inc bx
                add di,4
                jmp charshows
        
    ;--------------------------------------------------------------             
                
                
    sret:       pop bp
                pop es
                pop di
                pop dx
                pop bx
                ret
    ;-------------------------------------------------------------- 
    ;   選項(xiàng)4) 結(jié)束
    ;-------------------------------------------------------------- 
    
    
    ;--------------------------------------------------------------
    ;   主選單列出 
    ;--------------------------------------------------------------             
    ;   子程序:    toppage
    ;   功能: 在首頁(yè)列出4個(gè)選項(xiàng)   
    ;--------------------------------------------------------------
    toppage:    push bx
                push di
                push cx
                push ax
                push ds
                push es
                push si
                
                mov bx, offset menu_address - offset task + 7E00H
                mov di,160*8+25*2
                mov cx,4                ; 主頁(yè)顯示 4行 功能選項(xiàng)
                mov ax,0
                mov ds,ax
                mov ax,0B800H
                mov es,ax
    showtoppage:    mov si,ds:[bx]
                    call oneline
                    add bx,2
                    add di,160
                    loop showtoppage
                
                
                pop si
                pop es
                pop ds
                pop ax
                pop cx
                pop di  
                pop bx
                        
    ret
    
    oneline:    push cx
                push di
                push si
        onelines:   mov cl,ds:[si]
                    mov ch,0
                    jcxz onelineok
                    mov byte ptr es:[di],cl
                    mov ch,02H
                    mov byte ptr es:[di+1],ch
                    inc si  
                    add di,2
                    jmp short onelines
    onelineok:  pop si
                pop di
                pop cx
    ret     
    ;--------------------------------------------------------------
    
    

    
    ;--------------------------------------------------------------
    ;   常用子程序集合 開(kāi)始
    ;--------------------------------------------------------------
    ;   子程序:    clear_screen
    ;   功能: 清屏,將顯存中當(dāng)前屏幕中的字符設(shè)為空格符
    ;--------------------------------------------------------------
    clear_screen:   push bx
                    push cx
                    push es
                    push ax
                    mov bx,0B800H
                    mov es,bx
                    mov bx,0
                    mov cx,2000
                    mov ah,'a'
                    mov al,00000111B    ;黑底白字
    clear_screens:  mov byte ptr es:[bx],ah
                    mov byte ptr es:[bx+1],al
                    add bx,2
                    loop clear_screens
                    pop ax
                    pop es
                    pop cx
                    pop bx
    ret
    ;--------------------------------------------------------------
    ;   子程序:init_reg
    ;   功能: 寄存器設(shè)置
    ;--------------------------------------------------------------
    init_reg:   mov ax,0
                mov ds,ax
                mov ax,0B800H
                mov es,ax
    ret
    ;--------------------------------------------------------------
    
    
    
    ;--------------------------------------------------------------
    ;   常用子程序集合 結(jié)束
    ;--------------------------------------------------------------

    taskend:    nop
    ;--------------------------------------------------------------
    ; 任務(wù)程序結(jié)束
    ;--------------------------------------------------------------

code ends
end start

重啟計(jì)算機(jī) 與 引導(dǎo)現(xiàn)有操作系統(tǒng)代碼參考

http://bbs.fishc.com/thread-14756-1-1.html
https://blog.csdn.net/apollon_krj/article/details/72049772

引導(dǎo)程序 吧彪、任務(wù)程序 結(jié)構(gòu)說(shuō)明 以及 源碼使用方法 參見(jiàn)

http://www.reibang.com/p/2c8ace0ee240

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末待侵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姨裸,更是在濱河造成了極大的恐慌秧倾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傀缩,死亡現(xiàn)場(chǎng)離奇詭異那先,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赡艰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)售淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人慷垮,你說(shuō)我怎么就攤上這事揖闸。” “怎么了料身?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵汤纸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我芹血,道長(zhǎng)贮泞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任幔烛,我火速辦了婚禮啃擦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饿悬。我一直安慰自己令蛉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布乡恕。 她就那樣靜靜地躺著言询,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傲宜。 梳的紋絲不亂的頭發(fā)上运杭,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音函卒,去河邊找鬼辆憔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛报嵌,可吹牛的內(nèi)容都是我干的虱咧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锚国,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腕巡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起血筑,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绘沉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后豺总,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體车伞,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年喻喳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了另玖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡表伦,死狀恐怖谦去,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绑榴,我是刑警寧澤哪轿,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站翔怎,受9級(jí)特大地震影響窃诉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赤套,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一飘痛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧容握,春花似錦宣脉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)竹祷。三九已至,卻和暖如春羊苟,著一層夾襖步出監(jiān)牢的瞬間塑陵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工蜡励, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留令花,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓凉倚,卻偏偏與公主長(zhǎng)得像兼都,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稽寒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容