[086][匯編語(yǔ)言]課程設(shè)計(jì)2 :(2)從軟盤啟動(dòng)厌处,功能化選項(xiàng)按鍵 "1"(測(cè)試版)

前文

[085][匯編語(yǔ)言]課程設(shè)計(jì)2 :(1)從軟盤啟動(dòng),開機(jī)后主界面驱入,列出選項(xiàng)
http://www.reibang.com/p/0a99d34113c0

課程設(shè)計(jì)2 :(2)從軟盤啟動(dòng)昆烁,功能化選項(xiàng)按鍵 "1"(測(cè)試版)

  • 新增 : 開機(jī)進(jìn)入主界面后吊骤,對(duì)按鍵 “1” 的 功能測(cè)試
1、全屏字母小 "a " 代替全屏 空格 " "静尼,測(cè)試 [清屏] 功能白粉;
2传泊、在主界面,按下 按鍵1鸭巴,進(jìn)入測(cè)試版的功能選項(xiàng) 1) 或渤,屏幕中間出現(xiàn)一個(gè)彩色的字母 t ;
3奕扣、按下 F1 鍵,可以再次 [返回] 到主界面掌敬;
  • 這個(gè)測(cè)試版最大的突破在于惯豆, 在主界面需要通過 按鍵1 才能進(jìn)入功能選項(xiàng),在功能選項(xiàng)頁(yè)面需要按下 F1鍵 才能返回到主界面奔害;

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

1楷兽、用全屏a 代替全屏空格 表示清屏.png
2、按下 1鍵 進(jìn)入功能選項(xiàng)1) 測(cè)試版在屏幕中間顯示彩色的 t.png
3华临、進(jìn)入功能選項(xiàng)1) 之后芯杀,按下 F1鍵 返回到主界面.png

修改 任務(wù)程序 task 部分

    ;-------------------------------------------------------------- 
    ;   任務(wù)程序 開始     
    ;   任務(wù)程序 從 標(biāo)號(hào) task 開始 到 標(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)
    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 的鍵盤操作
    ;   實(shí)現(xiàn): 使用 BIOS int 16h 0號(hào)功能,讀取一個(gè)鍵盤輸入
    ;           返回值 (ah) = 掃描碼 , (al) = ASCII碼
    ;   鍵       1   2   3   4
    ;   掃描碼 02  03  04  05
    ;--------------------------------------------------------------
    key_toppage:    mov ah,0    
                    int 16h
                    
    key_input:      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_input
        
    key1:   call test1
            jmp short taskstart
    key2:   
        
    key3:   
            
    key4:   
    
    
    ;--------------------------------------------------------------
    
    test1:  call clear_screen
            mov di,160*12+40*2
            mov al,03H
            mov byte ptr es:[di],'t'
            mov byte ptr es:[di+1],al
            
        mywait: mov ah,0
                int 16H
                cmp ah,3BH  ;   3BH : F1鍵掃描碼
                je ok
                jmp short mywait
    ok: ret

    
                
    ;--------------------------------------------------------------             
    ;   子程序:    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     
    ;--------------------------------------------------------------
    
    

    
    ;--------------------------------------------------------------
    ;   常用子程序集合 開始
    ;--------------------------------------------------------------
    ;   子程序:    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é)束
    ;--------------------------------------------------------------

完整源碼

  • 引導(dǎo)程序 bootcode.asm 不需要改動(dòng) 直接復(fù)制于

http://www.reibang.com/p/0a99d34113c0

  • 任務(wù)程序 taskcode.asm
assume cs:code
data segment
    db 512 dup (0)
data ends
code segment
    start: 
            call setup
            call write
    
            mov ax,4c00h
            int 21H
    
    setup:
    ;   任務(wù)程序 安裝步驟
    ;   將任務(wù)程序機(jī)器碼安裝到data段開辟的內(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ù)程序
        ;   寫入 軟盤A 0面 0道 2扇區(qū)        
            mov ax,data
            mov es,ax
            mov bx,0
            
            mov al,1
            mov ch,0
            mov cl,2
            mov dl,0
            mov dh,0
            mov ah,3
            
            int 13h     
            ret
    
    ;-------------------------------------------------------------- 
    ;   任務(wù)程序 開始     
    ;   任務(wù)程序 從 標(biāo)號(hào) task 開始 到 標(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)
    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 的鍵盤操作
    ;   實(shí)現(xiàn): 使用 BIOS int 16h 0號(hào)功能筛圆,讀取一個(gè)鍵盤輸入
    ;           返回值 (ah) = 掃描碼 , (al) = ASCII碼
    ;   鍵       1   2   3   4
    ;   掃描碼 02  03  04  05
    ;--------------------------------------------------------------
    key_toppage:    mov ah,0    
                    int 16h
                    
    key_input:      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_input
        
    key1:   call test1
            jmp short taskstart
    key2:   
        
    key3:   
            
    key4:   
    
    
    ;--------------------------------------------------------------
    
    test1:  call clear_screen
            mov di,160*12+40*2
            mov al,03H
            mov byte ptr es:[di],'t'
            mov byte ptr es:[di+1],al
            
        mywait: mov ah,0
                int 16H
                cmp ah,3BH  ;   3BH : F1鍵掃描碼
                je ok
                jmp short mywait
    ok: ret

    
                
    ;--------------------------------------------------------------             
    ;   子程序:    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     
    ;--------------------------------------------------------------
    
    

    
    ;--------------------------------------------------------------
    ;   常用子程序集合 開始
    ;--------------------------------------------------------------
    ;   子程序:    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

代碼說明

關(guān)于測(cè)試版的功能選項(xiàng) 1)

 test1:  call clear_screen
            mov di,160*12+40*2
            mov al,03H
            mov byte ptr es:[di],'t'
            mov byte ptr es:[di+1],al
            
        mywait: mov ah,0
                int 16H
                cmp ah,3BH  ;   3BH : F1鍵掃描碼
                je ok
                jmp short mywait
    ok: ret
  • 目前測(cè)試版的選項(xiàng)功能就是扳碍,在屏幕中間顯示一個(gè)彩色的字母 t提岔,之后需要按下指定的返回鍵(F1鍵)才可以回到主界面;
  • 實(shí)現(xiàn)的核心是利用 BIOS int 16H 中斷笋敞,只有讀到指定的 返回鍵 - F1鍵 才會(huì)實(shí)現(xiàn)跳轉(zhuǎn)碱蒙;
  • 返回鍵 ,當(dāng)然可以設(shè)置成其他鍵夯巷,只要在 cmp ah,3BH 這里填上相應(yīng)的掃描碼即可振亮;

代碼參考

  • 這位博主的答案給我?guī)椭艽螅?/li>

https://blog.csdn.net/apollon_krj/article/details/72049772

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鞭莽,隨后出現(xiàn)的幾起案子坊秸,更是在濱河造成了極大的恐慌,老刑警劉巖澎怒,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒搔,死亡現(xiàn)場(chǎng)離奇詭異阶牍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)星瘾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門走孽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琳状,你說我怎么就攤上這事磕瓷。” “怎么了念逞?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵困食,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我翎承,道長(zhǎng)硕盹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任叨咖,我火速辦了婚禮瘩例,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甸各。我一直安慰自己垛贤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布趣倾。 她就那樣靜靜地躺著南吮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪誊酌。 梳的紋絲不亂的頭發(fā)上部凑,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音碧浊,去河邊找鬼涂邀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箱锐,可吹牛的內(nèi)容都是我干的比勉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驹止,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼浩聋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臊恋,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤衣洁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抖仅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坊夫,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砖第,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了环凿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梧兼。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖智听,靈堂內(nèi)的尸體忽然破棺而出羽杰,到底是詐尸還是另有隱情,我是刑警寧澤到推,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布考赛,位于F島的核電站,受9級(jí)特大地震影響环肘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜集灌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一悔雹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欣喧,春花似錦腌零、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至驯鳖,卻和暖如春闲询,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浅辙。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工扭弧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人记舆。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓鸽捻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泽腮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子御蒲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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