前文
[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)行
修改 任務(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ù)制于
- 任務(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>