?? main.asm
字號:
;main.asm文件為系統的主文件,包括主模塊在內。功能有顯示(輸出)數據內容、計算總分、刪除和響應鍵盤等
include macro.asm ;macro.asm宏文件
extrn start:far,new:far,load:far,save:far,ifc:far,input:far,del:far,sort:far,find:far,help:far
public res,pag,row,line,tot,pri,cur,flag,tota,findf,frow,fd,fstart
result struc ;成績單結構,由學號(nam,13字節)、姓名(num,7字節)、匯編語言成績(asm,4字節)、組成原理成績(ct,4字節)、操作系統成績(os,4字節)和總分(total,4字節)五部分構成,共44字節
nam db 11,?,11 dup('$')
num db 7,?,7 dup('$')
asm db 4,?,4 dup('$')
ct db 4,?,4 dup('$')
os db 4,?,4 dup('$')
total db 3 dup(' '),'$'
result ends
stacksg segment stack 's'
dw 128 dup('s')
stacksg ends
data segment public
res result 100 dup(<>) ;成績單結構數組res
pri db 100 dup(0) ;優先級數組pri,用于判斷光標當前位置是否達到可以輸入的優先級
cur db 1 ;輸入位置的行號
tot db 1 ;總條目數(初始唯一,實際比總條目數大1)
flag db 0 ;輸入標志(可以輸入為1,否則為0)
findf db 0 ;查找標志(找到為1,否則為0)
fstart db 1 ;查找開始行號(1——tot)
frow db ? ;查找到的數據的行號
n db ?
row db 3 ;光標行號(3,5,7,...,21)
line db 25 ;光標列號(25,36,43,47,51)
drow db ? ;欲顯示數據的行號(3,5,7,...,21)
dline db ? ;欲顯示數據的列號(25,36,43,47,51)
pag db 0 ;頁號(0——10)
tota dw 100 dup(0) ;總分數組
acc dw ? ;計算總分的累加器
fd dw -1 ;文件句柄
data ends
code segment
main proc far
assume cs:code,ds:data,es:data,ss:stacksg
mov ax,data
mov ds,ax
mov es,ax
stt: call far ptr start ;顯示開始畫面
draw: call far ptr ifc ;繪制表格
call disp ;顯示數據,幾乎每項功能調用之后都要調用繪制表格和顯示數據
cursor:
mov ah,2
mov bh,0
mov dh,row
mov dl,line
int 10h ;光標定位
mov findf,0
mov fd,-1
cj: mov ah,0 ;響應鍵盤
int 16h
cmp ah,01h ;ESC 退出
jz exit
cmp ah,1ch ;Enter 輸入(插入)
jz ipt
cmp ah,3bh ;F1 新建(刷新)
jz nf
cmp ah,3ch ;F2 讀取文件
jz lf
cmp ah,3dh ;F3 儲存文件
jz sf
cmp ah,3eh ;F4 排序
jz srt
cmp ah,3fh ;F5 查找
jz fnd
cmp ah,40h ;F6 刪除(輸入行)
jz del1
cmp ah,41h ;F7 幫助
jz hlp
cmp ah,42h ;F8 退出
jz exit
cmp ah,43h ;F9 排序
jz srt
cmp ah,44h ;F10 查找
jz fnd
cmp ah,52h ;Insert 輸入(插入)
jz ipt
cmp ah,47h ;Home 開始畫面
jz stt
cmp ah,53h ;Delete 刪除(當前行)
jz del2
cmp ah,4fh ;End 退出
jz exit
cmp ah,39h ;Space 輸入(插入)
jz ipt
cmp ah,31h ;n 新建(刷新)
jz nf
cmp ah,26h ;l 讀取文件
jz lf
cmp ah,1fh ;s 存儲文件
jz sf
cmp ah,20h ;d 刪除(輸入行)
jz del1
cmp ah,21h ;f 查找
jz fnd
cmp ah,23h ;h 幫助
jz hlp
cmp ah,0eh ;Backspace 退格(上一格,同坐鍵)
jz left
cmp ah,0fh ;Tab 跳格(下一格,同右鍵)
jz right
cmp ah,48h ;UpArrow 向上
jz up
cmp ah,50h ;DownArrow 向下
jz down
cmp ah,4bh ;LeftArrow 向左
jz left
cmp ah,4dh ;RightArrow 向右
jz right
cmp ah,49h ;PgUp 上翻頁
jz pu
cmp ah,51h ;PgDn 下翻頁
jz pd
jmp sta ;No Operation 無操作
ipt: mov al,row ;輸入(插入),計算當前行號(pag*10+row/2)及在結構res中的位置[(pag*10+row/2-1)*44]
xor ah,ah
mov bl,2
div bl
mov cl,al
mov al,pag
mov bl,10
mul bl
add al,cl
mov cur,al
cmp al,tot
ja sta
dec al
mov bl,44
mul bl
lea bp,res
add bp,ax
mov flag,1
call far ptr input ;輸入
cmp flag,0 ;若輸入標志為0,則不輸入
jz cj
cmp line,36 ;判斷當前列所在格的類型
ja i2
i1: jmp draw
i2: call sum ;若為分數格(line>36),則計算總分
jmp draw
nf: call far ptr new ;新建
jmp draw
lf: call far ptr load ;讀取
jmp draw
sf: call far ptr save ;存儲
jmp draw
srt: call far ptr sort ;排序
jmp draw
fnd: call far ptr find ;查找
jmp draw
del1: call far ptr del ;刪除輸入行
jmp draw
del2: call d2 ;刪除當前行
jmp draw
hlp: call far ptr help ;幫助
jmp draw
up: cmp row,3 ;向上(光標上移一行)
jz uj
sub row,2
jmp cursor
uj: cmp pag,0 ;光標以至首頁的第一行,發警告音提示
jz sta
mov row,21
dec pag
jmp draw
down: cmp row,21 ;向下(光標下移一行)
jz dj
add row,2
jmp cursor
dj: cmp pag,9 ;光標以至末頁的最后一行,發警告音提示
jz sta
mov row,3
inc pag
jmp draw
left: cmp line,51 ;向左(光標左移一格)
jz l1
cmp line,47
jz l2
cmp line,43
jz l3
cmp line,36
jz l4
cmp line,25
jz lj1
l1: mov line,47
jmp cursor
l2: mov line,43
jmp cursor
l3: mov line,36
jmp cursor
l4: mov line,25
jmp cursor
lj1: cmp row,3 ;光標已至每行最左一格,移至上行最右一個
jz lj2
sub row,2
mov line,51
jmp cursor
lj2: cmp pag,0 ;光標已至首頁的第一行最左一格,發警告音提示
jz sta
dec pag
mov row,21
mov line,51
jmp draw
right: cmp line,25 ;向右(光標右移一格)
jz r1
cmp line,36
jz r2
cmp line,43
jz r3
cmp line,47
jz r4
cmp line,51
jz rj1
r1: mov line,36
jmp cursor
r2: mov line,43
jmp cursor
r3: mov line,47
jmp cursor
r4: mov line,51
jmp cursor
rj1: cmp row,21 ;光標已至每行最右一格,移至下行最左一個
jz rj2
add row,2
mov line,25
jmp cursor
rj2: cmp pag,9 ;光標已至末頁的最后一行最右一格,發警告音提示
jz sta
inc pag
mov row,3
mov line,25
jmp draw
pu: cmp pag,0 ;上翻頁(若光標已至首頁,發警告音提示)
jz sta
dec pag
jmp draw
pd: cmp pag,9 ;下翻頁(若光標已至末頁,發警告音提示)
jz sta
inc pag
jmp draw
sta: mov ah,14 ;警告音,返回響應鍵盤處
mov al,7
mov bh,0
int 10h
jmp cj
exit: mov ax,4c00h
int 21h
main endp
disp proc far ;顯示(輸出)數據子函數disp
mov drow,3 ;置顯示的光標到首行首列
mov dline,25
mov al,pag
mov bl,10
mul bl
mov bl,44
mul bl
lea bx,res ;計算開始顯示的數據在結構中的位置(res+pag*10*44)
add bx,ax
mov n,0
lop: cmp n,10 ;每頁顯示10條數據
jz quit
dnam: mov dline,25
lea bp,[bx].nam+2
mov cl,[bx].nam+1
xor ch,ch
dispd drow,dline
dnum: mov dline,36
lea bp,[bx].num+2
mov cl,[bx].num+1
xor ch,ch
dispd drow,dline
dasm: mov dline,43
lea bp,[bx].asm+2
mov cl,[bx].asm+1
xor ch,ch
dispd drow,dline
dct: mov dline,47
lea bp,[bx].ct+2
mov cl,[bx].ct+1
xor ch,ch
dispd drow,dline
dos: mov dline,51
lea bp,[bx].os+2
mov cl,[bx].os+1
xor ch,ch
dispd drow,dline
dtot: mov dline,55
lea bp,[bx].total
mov cl,3
xor ch,ch
dispd drow,dline
add drow,2
add bx,44
inc n
jmp lop
quit: ret
disp endp
sum proc far ;計算總分子函數sum
mov acc,0 ;總分累加器置0
lea si,[bp].asm
call td ;計算匯編語言成績
add acc,ax
lea si,[bp].ct
call td ;計算組成原理成績
add acc,ax
lea si,[bp].os
call td ;計算操作系統成績
add acc,ax
mov al,row ;計算當前行號(pag*10+row/2)及在結構res中的位置[(pag*10+row/2-1)*44]
xor ah,ah
mov bl,2
div bl
mov cl,al
mov al,pag
mov bl,10
mul bl
add al,cl
dec al
mov dl,al
xor dh,dh
mov bl,44
mul bl
lea si,tota ;將總分寫入總分數組tota,位置與該條數據在成績單結構數組中的位置相同
add si,dx
add si,dx
mov bx,acc
mov [si],bx
lea si,[bp].total
mov byte ptr [si],' '
mov byte ptr [si+1],' '
mov byte ptr [si+2],' '
mov byte ptr [si+3],'$'
add si,3
call ta ;將總分轉換為字符
ret
sum endp
td proc far ;字符轉換為10進制數的子函數td
xor al,al
mov bl,10
mov cl,[si+1] ;字符串長度
cmp cl,0
jz td3
dec cl
xor ch,ch
add si,2
cmp cl,0
jz td2
td1: add al,[si]
sub al,30h
mul bl ;從字符串首位至倒數第二位,每位均計入al,并減30h('0'的ASCII值),再乘10
inc si
loop td1
td2: add al,[si] ;最后一位數加入al,并減30h
sub al,30h
xor ah,ah
td3: ret
td endp
ta proc ;10進制數轉換為字符串的子函數ta
mov ax,acc
mov bl,10
ta1: dec si ;用數字除以10,余數為低位,商作為下一次的被除數
div bl
add ah,30h
mov [si],ah
xor ah,ah
cmp al,0
jnz ta1
ta3: ret
ta endp
d2 proc ;刪除當前行的子函數d2
mov al,row ;計算當前行號(pag*10+row/2)及在結構res中的位置[(pag*10+row/2-1)*44]
xor ah,ah
mov bl,2
div bl
mov cl,al
mov al,pag
mov bl,10
mul bl
add al,cl
mov dl,al
xor dh,dh
dec al
mov bl,44
mul bl
lea bp,res
add bp,ax
lopd2: cmp tot,dl ;對從當前行起的每一行,用下一行數據覆蓋本行數據,至第(tot-1)行
jna d2q
lea si,[bp+44].nam
lea di,[bp].nam
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as1: mov byte ptr [di],' '
inc di
loop as1
lea di,[bp].nam
ass
lea si,[bp+44].num
lea di,[bp].num
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as2: mov byte ptr [di],' '
inc di
loop as2
lea di,[bp].num
ass
lea si,[bp+44].asm
lea di,[bp].asm
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as3: mov byte ptr [di],' '
inc di
loop as3
lea di,[bp].asm
ass
lea si,[bp+44].ct
lea di,[bp].ct
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as4: mov byte ptr [di],' '
inc di
loop as4
lea di,[bp].ct
ass
lea si,[bp+44].os
lea di,[bp].os
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as5: mov byte ptr [di],' '
inc di
loop as5
lea di,[bp].os
ass
lea si,[bp+44].total
lea di,[bp].total
mov cl,3
xor ch,ch
as6: mov byte ptr [di],' '
inc di
loop as6
lea di,[bp].total
ast
lea si,tota ;對總分數組也執行同樣的覆蓋操作
add si,dx
add si,dx
mov di,si
add si,2
mov ax,[si]
mov [di],ax
inc dl
add bp,44
jmp lopd2
d2q: lea si,tota ;對總分數組的第tot項數據置0
add si,dx
add si,dx
mov [si],0
dec tot ;條目總數自減
ret
d2 endp
code ends
end main
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -