学生成绩管理系统 汇编语言

更新时间:2023-11-09 22:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

;==学生成绩管理系统==

;******************************************************************************* ;EQU STATEMENTS GO HERE StructNode equ 32 ;表达式赋值微操作equ page133 Node_name equ 0 ;类似define Node_num equ 12 Node_maths equ 18 Node_english equ 20 Node_chinese equ 22 Node_others equ 24 Node_total equ 26 Node_avg equ 28 Node_next equ 30

max_record equ 100 max_menu_index equ 9

;*******************************************************************************

;******************************************************************************* data_seg segment ;define data segment ;DATA GOES HERE buf1 DB 30 buf1_slen DB ? buf1_data DB 30 dup(?) bufname DB 20 bufname_slen DB ? bufname_data DB 20 dup(?) bufgetint DB 32 bufgetint_slen DB ? bufgetint_data DB 32 dup(?) str_menu DB 0dH, 0aH, '=====Student marks system=====', 0dH, 0aH, 0dH, 0aH DB ' 1)Add Record', 0dH, 0aH, 0dH, 0aH DB ' 2)Print All', 0dH, 0aH, 0dH, 0aH DB ' 3)Save', 0dH, 0aH, 0dH, 0aH DB ' 4)Open', 0dH, 0aH, 0dH, 0aH, 0dH, 0aH DB ' 5)Find', 0dH, 0aH, 0dH, 0aH, 0dH, 0aH DB ' 6)Delete', 0dH, 0aH, 0dH, 0aH, 0dH, 0aH DB ' 0)Exit', 0dH, 0aH DB 'Choice:$' ;Error Strings

str_error_1 DB 'Error input!', 0dH, 0aH, '$' jump_tb DW case_0 DW case_1 DW case_2 DW case_3 DW case_4 DW case_5 DW case_6 head DW ? ;表头指针 info_0 db 'input num:', '$' info_1 db 'input math:', '$' info_2 db 'input english:', '$' info_3 db 'input chinese:', '$' info_4 db 'input others:', '$' info_5 db 'input name:', '$' str_tb_head db 'Num', 9,'Name', 9, 'Maths', 9, 'English', 9, 'Chinese', 9,'Others', 9, 'Total', 9, 'Avg', 0dH, 0aH db '=================================================================', 0dH, 0aH,'$' str_tab db 9, '$' rdata db (StructNode * (max_record+1)) dup(?) ;全部结点*(100+1) rdata_p dw rdata ;下一个可用结点 rcount dw 00H ;当前已分配的结点数 newnode dw ? pnode dw ? file_name db 'c:\\student.txt', 00H file_error1 db 'Failed create file...', 0DH, 0AH, '$' file_error2 db 'Failed write file...', 0DH, 0AH, '$' file_error3 db 'Failed open the file...', 0DH, 0AH, '$' file_error4 db 'Failed read file...', 0DH, 0AH, '$' file_info_1 db 'saving the file...', 0DH, 0AH, '$' file_info_2 db 'Write to file successfully!', 0DH, 0AH, '$' file_info_3 db 'opening the file...', 0DH, 0AH, '$' file_info_4 db 'read the file successfully!', 0DH, 0AH, '$' fp1 dw ? ;文件指针 data_seg ends

;*******************************************************************************

;******************************************************************************* extdata_seg segment ;define extra data segment ;EXTRA DATA GOES HERE

extdata_seg ends

;*******************************************************************************

;******************************************************************************* stack_seg segment stack ;define extra data segment ;STACK DATA GOES HERE DB 100H dup(?) stack_seg ends

;*******************************************************************************

;******************************************************************************* program segment ;define code segment

;******************************************************************************* main proc far ;main part of program

assume cs:program, ds:data_seg, es:extdata_seg, ss:stack_seg start:

;set up stack for return push ds sub ax, ax push ax

;set DS register to current data segment mov ax, data_seg ;data_seg segment addr mov ds, ax ;into DS register mov ax, extdata_seg ;extdata_seg segment addr mov es, ax ;into ES register mov ax, stack_seg ;stack_seg segment addr mov ss, ax ;into SS register

;MAIN PART OF PROGRAM GOES HERE ;分配链表头结点 mov ax, rdata_p

mov head, ax ;当前头指针就是rdata_p add rdata_p, StructNode mov bx, head mov word ptr [bx+Node_next], 00H

lb_print_menu: ;打印菜单 lea dx, str_menu mov ah, 09H int 21H call far ptr getint cmp dx, max_menu_index ja lb_print_menu mov di, dx shl di, 1 jmp jump_tb[di] jmp lb_print_menu

case_0: ;Exit ret case_1: ;添加记录 call far ptr addrecord jmp lb_print_menu

case_2: ;打印所有记录 call far ptr print_record jmp lb_print_menu

case_3: ;保存到文件 call far ptr save_record jmp lb_print_menu

case_4: ;从文件中读取 call far ptr read_record jmp lb_print_menu

case_5: ;查找 call far ptr find_record jmp lb_print_menu

case_6: ;删除 call far ptr delete_record

jmp lb_print_menu ret ;return to DOS main endp ;end of main part of program

;*******************************************************************************

;******************************************************************************* sub1 proc near ;define subprocedure push ax push bx push cx push dx ;main port of sub procedure ;exit sub procedure pop dx pop cx pop bx pop ax ret sub1 endp ;end of subprocedure

;*******************************************************************************

;******************************************************************************* ;print CRLF crlf proc far push dx push ax mov dl, 0dH mov ah, 02H int 21H mov dl, 0aH mov ah, 02H int 21h pop ax pop dx ret crlf endp

;*******************************************************************************

;******************************************************************************* ;从键盘输入一个整数,结果保存到dx中 getint proc far ;define subprocedure push ax push bx push cx ;main port of sub procedure mov dx, offset bufgetint ;offset 偏移地址 mov ah, 0aH int 21H call far ptr crlf mov ax, offset bufgetint_data push ax ;字符串首地址 mov al, bufgetint_slen cbw ;字节转字 push ax ;字符串长度 push ax ;返回值 call far ptr decibin pop dx pop ax pop ax ;exit sub procedure pop cx pop bx pop ax ret

getint endp ;end of subprocedure

;*******************************************************************************

;******************************************************************************* ;把以十制进数形式存储在字符串中的数转成整数 ;栈中的参数:

;0 字符串首地址 ;1 字符串长度 ;2 存放结果

decibin_para_len equ 3 decibin_str1 equ word ptr[bp+4+(decibin_para_len-0)*2] decibin_str1len equ word ptr[bp+4+(decibin_para_len-1)*2] decibin_retsult equ word ptr[bp+4+(decibin_para_len-2)*2] decibin proc far

;save registers push bp mov bp, sp push ax push bx push cx push dx push si push di mov bx, 00H mov cx, decibin_str1len mov di, decibin_str1 decibin_loop1: mov al, byte ptr [di] ; di为偏移量以字节为单位 把地址送入al and al, 0fH cbw xchg bx, ax mov si, 10 mul si add bx, ax inc di loop decibin_loop1 mov decibin_retsult, bx exit_decibin: ;恢复寄存器 pop di pop si pop dx pop cx pop bx pop ax pop bp ret

decibin endp

;*******************************************************************************

;******************************************************************************* ;把bx中的数以十进制形式输出 ;输入:数据存放在bx中 binidec proc far push ax push bx push cx push dx push si mov si, 01H mov cx,10000d ;各位依次输出 call dec_div mov cx,1000d

call dec_div mov cx,100d call dec_div mov cx,10d call dec_div mov cx,1d mov si, 00H call dec_div pop si pop dx pop cx pop bx pop ax ret

binidec endp

dec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx ;保留余数 mov dl,al ;商送入dl cmp si, 00H ;输出这一位 je lb1_dec_div cmp dl, 00H ;处理完毕 je exit_dec_div mov si, 00H lb1_dec_div: add dl,30h mov ah, 02H int 21H

exit_dec_div: ret

dec_div endp

;*******************************************************************************

;******************************************************************************* addrecord proc far ;define subprocedure push ax push bx push cx push dx push si push di push es ;main port of sub procedure mov ax, rdata_p ;当前指针移入ax mov newnode, ax ;再移入newnode存储单元中

add rdata_p, StructNode ;相当于指针加一 add rcount, 1 ;计数器加一

mov bx, ax ;当前指针(newnode所指)移入bx mov cx, 00H ;计算总分

mov word ptr [bx+Node_next], 00H ;Node_next置 lea dx, info_0 mov ah, 09H int 21H

call far ptr getint call crlf

mov word ptr [bx+Node_num], dx lea dx, info_1 mov ah, 09H int 21H

call far ptr getint call crlf add cx, dx

mov word ptr [bx+Node_maths], dx lea dx, info_2 mov ah, 09H int 21H

call far ptr getint call crlf add cx, dx

mov word ptr [bx+Node_english], dx lea dx, info_3 mov ah, 09H int 21H

call far ptr getint call crlf add cx, dx

mov word ptr [bx+Node_chinese], dx lea dx, info_4 mov ah, 09H int 21H

call far ptr getint call crlf add cx, dx

mov word ptr [bx+Node_others], dx

mov word ptr [bx+Node_total], cx ;计算平均成绩 mov ax, cx cwd

mov cx, 4 div cx

mov word ptr [bx+Node_avg], ax

lea dx, info_5 mov ah, 09H int 21H ;输入姓名 lea dx, bufname mov ah, 0aH int 21H call far ptr crlf mov ax, ds mov es, ax mov al, bufname_slen cbw mov bx, ax mov byte ptr bufname_data[bx], '$' lea si, bufname_data mov di, newnode mov cx, bx inc cx cld rep movsb ;add the new node to the list mov di, newnode ;newnode现在存放的是当前项的地址 mov si, head ;head存放的是头指针 mov ax, word ptr [si+Node_next] mov word ptr [di+Node_next], ax ;当前加入项指向上次项(head指向的送当前项指针Node_next) mov word ptr [si+Node_next], di ;头指针指向当前加入项(当前项的地址送head) ;exit sub procedure pop es pop di pop si pop dx pop cx pop bx pop ax ret

addrecord endp ;end of subprocedure

;*******************************************************************************

;******************************************************************************* print_record proc far ;define subprocedure push ax push bx push cx push dx

pop cx loop loop1_read_record

read_record_ok: lea dx, file_info_4 mov ah, 09H int 21H jmp read_record_close_file

read_record_error1: lea dx, file_error3 mov ah, 09H int 21H jmp exit_read_record

read_record_error2: lea dx, file_error4 mov ah, 09H int 21H jmp exit_read_record

read_record_close_file: mov ah, 3eH mov bx, fp1 int 21H

exit_read_record: ;exit sub procedure pop di pop si pop dx pop cx pop bx pop ax ret

read_record endp ;end of subprocedure

;******************************************************************************* find_record proc far push ax push bx push cx push dx push si push di lea dx, info_0 mov ah, 09H int 21H call far ptr getint call crlf mov si, head mov di, head

find_again: mov di,word ptr [di+Node_next] cmp dx ,word ptr [di+Node_num] ;第n个结点的学号 je modify_record jmp find_again modify_record: mov bx, di ;当前指针(newnode所指)移入bx mov cx, 00H ;计算总分 lea dx, info_0 mov ah, 09H int 21H call far ptr getint call crlf mov word ptr [bx+Node_num], dx lea dx, info_1 mov ah, 09H int 21H call far ptr getint call crlf add cx, dx mov word ptr [bx+Node_maths], dx lea dx, info_2 mov ah, 09H int 21H call far ptr getint call crlf add cx, dx mov word ptr [bx+Node_english], dx lea dx, info_3 mov ah, 09H int 21H call far ptr getint call crlf add cx, dx mov word ptr [bx+Node_chinese], dx lea dx, info_4 mov ah, 09H int 21H call far ptr getint call crlf add cx, dx mov word ptr [bx+Node_others], dx mov word ptr [bx+Node_total], cx ;计算平均成绩 mov ax, cx cwd mov cx, 4 div cx mov word ptr [bx+Node_avg], ax

pop di pop si pop dx pop cx pop bx pop ax ret

find_record endp

;******************************************************************************* delete_record proc far push ax push bx push cx push dx push si push di lea dx, info_0 mov ah, 09H int 21H call far ptr getint call crlf mov si, head mov di, head

go_again: mov di,word ptr [di+Node_next] cmp dx ,word ptr [di+Node_num] ; je de_record jmp go_again

de_record: mov si, word ptr[si+Node_next] mov ax,word ptr[si+Node_num] mov word ptr[di+Node_num],ax mov ax,word ptr[si+Node_name] mov word ptr[di+Node_name],ax mov ax,word ptr[si+Node_name+2] mov word ptr[di+Node_name+2],ax mov ax,word ptr[si+Node_name+4] mov word ptr[di+Node_name+4],ax mov ax,word ptr[si+Node_name+6] mov word ptr[di+Node_name+6],ax mov ax,word ptr[si+Node_name+8] mov word ptr[di+Node_name+8],ax mov ax,word ptr[si+Node_name+10] mov word ptr[di+Node_name+10],ax mov ax,word ptr[si+Node_maths] mov word ptr[di+Node_maths],ax mov ax,word ptr[si+Node_english] mov word ptr[di+Node_english],ax mov ax,word ptr[si+Node_chinese]

第n个结点的学号 mov word ptr[di+Node_chinese],ax mov ax,word ptr[si+Node_others] mov word ptr[di+Node_others],ax mov ax,word ptr[si+Node_total] mov word ptr[di+Node_total],ax mov ax,word ptr[si+Node_avg] mov word ptr[di+Node_avg],ax mov si,head mov di,head mov di,word ptr [di+Node_next] mov ax,word ptr [di+Node_next] mov word ptr[si+Node_next],ax sub rcount, 1 pop di pop si pop dx pop cx pop bx pop ax ret

delete_record endp

;*******************************************************************************

program ends ;end of code segment

;******************************************************************************* end start ;end of assembly

本文来源:https://www.bwwdw.com/article/j49v.html

Top