彙編語言設計:根據輸入改變屏幕顏色

0.寫在前面

該程序實現了「根據輸入改變屏幕顏色」。其實這個程序自己沒什麼意思,純粹只是將學習到的知識融合在了一塊兒而已。程序自己過於繁瑣了,寫得並非很好。以及這是我彙編實驗課程的做業,若是你們有相似做業的話但願不要過分借鑑,本程序僅供參考和學習。學習

1.設計目的

1)體驗並瞭解DOS界面下色彩顯示;
2)瞭解並掌握INT10功能BIOS調用顯示屏幕控制。字體

2.程序功能

① 建立小屏;
② 提示輸入姓名;
③ 詢問背景顏色並修改背景色;
④ 詢問字體顏色並修改字體色;
⑤ 詢問是否閃爍並修改閃爍;
⑥ 輸出姓名及問候語。spa

3.源代碼

stack segment stack
    db 64 dup (?)
stack ends
data segment
    buff db 50,?,50 dup(?)
    nam0 db 'What is your name ?$'
    bkc0 db 'What is your background color ?$'
    bkc1 db '->(input RGB:0-7):$'
    fc0  db 'What is your font color ?$'
    fc1  db '->(input RGB:0-7):$'
    tw0  db 'Do you like twinkle ?$'
    tw1  db '->(like:1  dislike:0): $'
    hel0 db 'Hello!$'
    hel1 db 'Welcome to MASM!$'
    arro db '->$'
data ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
       mov ds,ax             ;使ds指向data數據段
       
       mov ah,6              ;初始化屏幕
       mov al,0
       mov ch,0
       mov cl,0
       mov dh,24
       mov dl,79
       mov bh,7
       int 10h

       mov bh,00001111b      ;黑底白字
       call scroll
       call cursor
       mov dx,offset nam0
       mov ah,9
       int 21h               ;輸出字符串,提示輸入姓名

       
       mov bh,10001111b
       call scroll
       call cursor
       mov dx,offset buff
       mov ah,10
       int 21h               ;輸入字符串至緩衝區
       call scroll

       mov bh,00001111b      ;閃爍黑底白字
       call scroll
       call cursor
       mov dx,offset bkc0
       mov ah,9
       int 21h               ;輸出字符串,詢問背景色
       call scroll
       call cursor
       mov dx,offset bkc1
       mov ah,9
       int 21h               ;輸出字符串,提示輸入格式
       
       mov bh,10001111b
       call scroll
       call cursor
       mov dx,offset arro
       mov ah,9
       int 21h               ;輸出箭頭
       mov ah,1
       int 21h               ;輸入背景色
       sub al,30h
       call scroll
       
       mov cl,4
       shl al,cl
       mov bh,00001000b
       add bh,al             ;將bh的4-6位改成輸入的背景色
       call scroll
       call cursor
       mov dx,offset fc0
       mov ah,9
       int 21h               ;輸出字符串,詢問字體色
       call scroll
       call cursor
       mov dx,offset fc1
       mov ah,9
       int 21h               ;輸出字符串,提示輸入格式
       
       or bh,10000000b
       call scroll
       call cursor
       mov dx,offset arro
       mov ah,9
       int 21h               ;輸出箭頭
       mov ah,1
       int 21h               ;輸入字體色
       sub al,30h
       call scroll
       
       add bh,al             ;將bh的0-2位改成輸入的字體色
       and bh,01111111b
       call scroll
       call cursor
       mov dx,offset tw0
       mov ah,9
       int 21h               ;輸出字符串,詢問是否閃爍
       call scroll
       call cursor
       mov dx,offset tw1
       mov ah,9
       int 21h               ;輸出字符串,提示輸入格式
       
       or bh,10000000b
       call scroll
       call cursor
       mov dx,offset arro
       mov ah,9
       int 21h               ;輸出箭頭
       mov ah,1
       int 21h               ;輸入閃爍
       sub al,30h
       call scroll
       
       cmp al,1
       je twin
       and bh,01111111b      ;若閃爍,將bh的7位改成1
       jmp a
twin:  or bh,10000000b       ;若不閃爍,將bh的7位改成0
       
a:       call scroll
       call cursormid
       mov dx,offset hel0
       mov ah,9
       int 21h               ;輸出問候
       
       push bx
       call scroll
       call cursormid
       mov bl,buff+1         ;將輸入的字符數存至bl
       add bl,2              ;將bl加2,使之指向最後一個字符的下一個字符
       mov bh,0              ;將bh置零
       add bx,offset buff    ;將buff的偏移地址加到bx中
       mov byte ptr [bx],'!' ;在字符串最後寫入'!'
       add bx,1              ;將bx加1,使之指向下一個字符
       mov byte ptr [bx],'$' ;在字符串最後寫入'$'

       mov dx,offset buff+2
       mov ah,9
       int 21h               ;輸出字符串(即所存姓名、'!')
       
       pop bx
       call scroll
       call cursormid
       mov dx,offset hel1
       mov ah,9
       int 21h               ;輸出字符串,問候               

       mov ah,4ch
       int 21h               ;結束程序
       
scroll proc near
      push ax
      push bx
      push cx
      push dx

      mov ah,6
      mov al,1
      mov ch,8
      mov cl,30
      mov dh,16
      mov dl,60
      int 10h               ;下滾一行
      
      pop dx
      pop cx
      pop bx
      pop ax
      ret
scroll endp
      
cursor proc near
      push ax
      push bx
      push dx
      
      mov ah,2
      mov dh,16
      mov dl,30               ;移動光標
      mov bh,0
      int 10h

      pop dx
      pop bx
      pop ax
      ret
cursor endp
       
cursormid proc near
      push ax
      push bx
      push dx
      
      mov ah,2
      mov dh,16
      mov dl,38               ;移動光標
      mov bh,0
      int 10h

      pop dx
      pop bx
      pop ax
      ret
cursormid endp
       
code ends
end start

4.流程圖

image.png

相關文章
相關標籤/搜索