学生成绩排名-汇编语言综合实验报告

合集下载

学生成绩排名-汇编语言综合实验报告

学生成绩排名-汇编语言综合实验报告
OUT3DB'SCORE:$'
NEQU8
MEQU4
FEQU3
PEQU3
QEQU3
BUFF3DBF,?,FDUP(0),'$'
BUFF1DBN,?,NDUP(0),'$'
BUFF2DBM,?,MDUP(0),'$'
NUMBERDBPDUP(F+1DUP(0))
SNAMEDBPDUP(N+1DUP(0))
REP STOSB
MOVCX,M+1
LEASI,BUFF2+2
LEADI,SCORE1
ADDDI,SIGN2
CLD
REP MOVSB
LEASI,BUFF2+2
MOVDI,SIGN2
CALL CHANGE
RET
COPY ENDP
CHANGE PROC
MOVX,0
MOVCX,[SI-1]
ANDCX,000FH
子程序COPY的设计业分为三个部分:学号转存,姓名转存,成绩转存。三个数据的转存方法也相同的。首先将长度传给CX寄存器,再将源目标地址和目的地址分别给SI和DI,再调用REP MOVSB 进行串传送,传送完成之后,要将原来的BUFF缓存区清空,全部设置为$。但是由于成绩是以十进制保存的,所以还要转换为二进制。则在子程序COPY中调用CHANGE程序
全部代码:
DATASSEGMENT
INFOR0DB0AH,0DH,'SORT=$'
INFOR1DB0AH,0DH,'INPUT NAME:$'
INFOR2DB0AH,0DH,'INPUT SCORE:$'

汇编学生管理系统实验报告

汇编学生管理系统实验报告

《汇编语言程序设计》综合程序设计实验报告题目:简单学生成绩管理一、项目简介本程序为一简单的学生成绩管理程序,通过学生姓名对学生成绩进行相应的增删改查操作,同时加入音乐程序让系统更加生动、形象。

语言为80x86汇编语言,运行环境为MASM6.0 二、小组成员具体分工小组成员共同商讨完成程序的需求分析,设计好程序的各个功能模块。

具体分工:曹玉松:完成学生成绩的查询,输出,排序,程序整合 吕盼举:音乐播放、清屏、图形输出、实验报告撰写 三、需求分析与设计(对项目的详细分析步骤)成绩管理系 统学生成绩查询显示音乐频率波状图音乐播放清屏(设置背景色)输出学生信息 对学生成绩排序输出选择乐曲播放本程序综合运用课上所学知识,主在完成学生成绩的管理工作,首先,有一个菜单界面,用来给用户提示信息,提供七个菜单选项,包括成绩的查询,学生信息的输出,成绩的排序、增加、删除等,另外还有一个让人劳逸结合的音乐播放功能,有音乐的选择、播放功能,在放音乐的同时可以将音乐的频率随着音乐同步以柱状图形显示在屏幕上,模拟mp3音乐播放的功能。

四、代码及分析亮点一:子程序综合运用各种子程序,嵌套调用,既有段内也有段间子程序亮点二:宏多次使用宏定义,通过宏的调用使程序代码简化亮点三:音乐播放选择乐曲进行播放,亮点四:图形动态显示调用时钟中断,绘制图像,动态显示亮点五:伪操作代码:output macro s mov dl,sadd dl,30hmov ah,2int 21hendmshow macro xingcan lea dx,xingcanmov ah,9int 21hendmshuru macro aLEA SI, ds:MUS_FREQ&a ;取发声的频率(音阶)表首地址LEA BP, ds:MUS_TIME&a ;endmhuanhang macromov ah,2mov dl,10int 21hmov ah,4chmov ah,2mov dl,13int 21hmov ah,4chendmshowkongge macro mov ah,2mov dl,00hint 21hmov ah,4chendmSTACK SEGMENT PARA STACK 'STACK' ;定义堆栈段DB 64 DUP ('STACK...') STACK ENDS ;以上定义堆栈段;************************** ****************DATAS SEGMENTMUS_FREQ0 DW 330,294,262,294,3 dup(330)dw 3 dup(294),330,392,392DW330,294,262,294,4dup(330),294,294,330,294,262,-1MUS_TIME0 DW 6 dup(25),50DW 2 dup(25,25,50)DW 12 dup(25),100 MUS_FREQ1 dw 330,392,330,294,330,392,330,29 4,330dw330,392,330,294,262,294,330,39 2,294dw260,262,220,196,220,262,294,33 0,262,-1MUS_TIME1 dw 3 dup(50),25,25,50,25,25,100dw 2 dup(50,50,25,25),100dw 3 dup(50,25,25),100MUS_FREQ2 DW 262, 262, 294, 262, 349, 330, 262dw 262, 294, 262,392, 349, 262, 262DW 294, 440, 349, 330, 294, 466dw 466,440,262, 392, 349, -1MUS_TIME2 DW 25, 25, 50, 50, 50, 100DW 25, 25, 50, 50, 50, 100DW 25, 25, 50, 50, 50, 50, 150DW 25, 25, 50, 50, 50, 100score dw 64,71,66,61,78,80,83,89,79N=$-scoren1=N/2name1 db 'aa$'db 'bb$'db 'cc$'db 'dd$'db 'ee$'db 'ff$'db 'gg$'db 'hh$'db 'ii$'x equ $-name1ww equ x/2len_s equ 2str_d db 30,?,30 dup(?) mess1 db 'match$'mess2 db 'no name!$'nam db 13,10,'name grade',13,10,'$'string db 10,13,'********************* 'db 10,13,'1.output the name and grade'db 10,13,'2.seek'db 10,13,'3.paixu'db 10,13,'4.tongji'db 10,13,'5.qingping'db 10,13,'oyijiehe'db 10,13,'7.Quit'db10,13,'********************* 'db 10,13,'select:','$'function1 db 10,13,'output:',10,13,'$'function2 db 10,13,'input:','$'function3 db 10,13,'***********Goodbye!***********','$'temp1 dw ?temp2 dw ?a db 10b dw ?hc db 1MUS_LST DB'****************', 0DH, 0AHDB '0 MUSIC 0', 0DH, 0AHDB '1 MUSIC 1', 0DH, 0AHDB '2 MUSIC 2', 0DH, 0AHDB '3 exit ', 0DH, 0AHDB'****************', 0DH, 0AH, '$'DATAS ENDSCODES SEGMENTASSUMECS:CODES,DS:DATAS,SS: STACKSTART:MOV AX,DATASMOV DS,AXMOV ES,AXhaha: mov ah, 00hmov al, 10h ;选择显示方式10h(16色图形)int 10hmov ah, 0bhmov bh, 00hmov bl, 01h ;背景设为蓝色int 10hcall functionfunction:lea dx,stringmov ah,9int 21hmov ah,1int 21hcmp al,'1'je case1cmp al,'2'je case2cmp al,'3'je case3cmp al,'4'je case4cmp al,'5'je case5cmp al,'6'je case6cmp al,'7'je case7jmp functioncase1: lea dx,function1mov ah,9int 21hmov cx,n1mov bp,offset name1 xianshixingming:mov dx,bpmov ah,9int 21hshowkonggeadd bp,3loop xianshixingminghuanhangMOV CX,N/2call showscorejmp functioncase2:show function2lea dx,str_dmov ah,0ahint 21hmov cl,wwLEA SI,name1mov di,0push dibijiao:push cxpush dx;比较字符串长度是否一致XOR bX,bXMOV bL,str_d+1CMP bX,len_sJNE MS;比较字符串中各元素是否一致LEA DI,str_d+2mov cl,len_slea bp,scorepush siMAD:MOV AL,DS:[SI]MOV BL,ES:[DI]CMP AL,BLJNE MSINC SIINC DILOOP MADpop siMOV CX,1huanhangpop dimov si,0 push dicall showscoreMS: pop diadd di,2push dipop cxloop bijiaolea dx,mess2 SHOW3:;输出匹配结果信息MOV AH,09HINT 21HMOV AH,4CHjmp functioncase3:call maopaocase4: call tongji case5: jmp hahacase6:push axpush bxpush cxpush dxpush sipush bppush dicall MP3pop dipop bppop sipop dxpop cxpop bxpop axjmp functioncase7: lea dx,function3mov ah,9int 21hMOV AH,4CHINT 21H MP3 proccall waitfa5:lea dx,mus_lstmov ah,09int 21hmov ah,01int 21hcmp al,'0'jz a1cmp al,'1'jz a2cmp al,'2'jz a3cmp al,'3'jz end_musjmp a5ac: call waitfa1: shuru 0call waitfjmp a4a2: shuru 1call waitfjmp a4a3: shuru 2call waitfa4: mov cx,0mov bl,0FREQ:MOV DI, ds:[si] ;读取频率值CMP DI, -1 ;歌曲结束了吗?JE a5mov bl,01mov dx,disub dx,190mov b,dx aa: mov ah, 0ch ;写像素点mov al, blint 10hinc dxcmp dx, 400jne aamov dx,bpush axsub ax,axinc cxsub a,5mov ax,cxdiv amov a,10cmp ah,0pop axjnz aaMOV BX, DS:[BP] ;读取节拍CALL SOUNDF ;调通用发声子程序inc cx; aainc cx; jne aainc cx; jne aainc cx; jne aainc cxadd cx,5cmp cx,150jbe abcall waitfmov cx,0ab: ADD SI, 2ADD BP, 2; ad:inc cxJMP FREQEND_MUS:; mov ax,4c00h;int 21hretMP3 endpSOUNDF PROC nearPUSH AXPUSH BXPUSH CXPUSH DXPUSH DIMOV AL, 0b6H ;写定时器8253的工作方式OUT 43H, ALMOV DX, 12H ;根据频率求8253的计数值,即533H*896/freqMOV AX, 348ch ;(DX),(AX)=123280H=53 3H*896DIV di ;(DI) = freqOUT 42H, AL ;向8253送计数值MOV AL, AHOUT 42H, ALIN AL, 61H ;取8255的PB口当前内容,并保护MOV AH, ALOR AL, 3 ;开始发声,PB1=1,PB0=1OUT 61H, ALWAIT1: MOV CX, 28000 ;延时(BX)×10msdelay: loop delaydec bxjnz WAIT1MOV AL, AHAND AL, 0FCH ;停止发声,PB1=0,PB0=0OUT 61H, ALPOP DIPOP DXPOP CXPOP BXPOP AXRETSOUNDF ENDP;************************** ****************WAITF PROC NEARPUSH AXmov ah, 00hmov al, 10h ;选择显示方式10h(16色图形)int 10hmov ah, 0bhmov bh, 00hmov bl, 01h ;背景设为蓝色int 10hmov ah, 0bhmov bh, 01hmov bl, 00h ;设置调色板0#int 10hPOP AXRETWAITF ENDP;CSEG ENDS ;以上定义代码段;************************** ****************showscore procCODES SEGMENTASSUMECS:CODES,DS:DATASMOV AX,DATASMOV DS,AXMOV DI,0MOV BP,N+5 SHOW2:PUSH CXMOV DX,0MOV AX,[SI]CALL DTOC2CALL SHOW_STR2ADD SI,2POP CXLOOP SHOW2call functionDTOC2 PROCS:MOV CX,10CALL DIVDW2ADD CL,30HMOV DS:[BP],CL INC DIPUSH AXADD AX,DXJZ BACKPOP AXDEC BPJMP SBACK:POP AX RETDTOC2 ENDP DIVDW2 PROC PUSH AXMOV AX,DX MOV DX,0DIV CXMOV BX,AX POP AXDIV CXMOV CX,DX MOV DX,BX RET DIVDW2 ENDP SHOW_STR2 PROC S2: MOV AH,2MOV DL,DS:[BP]INT 21HINC BPDEC DIJZ OKJMP S2OK: MOV AH,2MOV DL,0INT 21HRETSHOW_STR2 ENDP codes ends showscore endpmaopao proc CODES SEGMENTpush cspush dspush axASSUME CS:CODESMOV SI,0MOV CX,N/2-1CALL BUBBLEMOV CX,N/2MOV SI,0MOV DI,0MOV BP,N+5call showscoreBUBBLE PROCL1:PUSH CXLEA SI,scoreL2:MOV AX,score[SI]CMP AX,score[SI+2]JBE NEXTXCHG AX,score[SI+2]MOV score[SI],AX NEXT:ADD SI,2LOOP L2POP CXLOOP L1huanhangRETBUBBLE ENDPretpop axpop cxpop dxCODES ENDS maopao endpclr_screen proc near mov ah,06hmov cx,temp1mov dx,temp2int 10hmov ah,02hmov dh,24mov dl,80mov bh,0int 10hretclr_screen endptongji procDATAS SEGMENTnum_under60 db 0num_60to69 db 0num_70to79 db 0num_80to89 db 0num_90to99 db 0num_100 db 0string10 db ' the number under 60:$'string20 db 'the number between 60 and 69:$'string30 db 'the number between 70 and 79:$'string40 db 'the number between 80 and 89:$'string50 db 'the number between 90 and 99:$'string60 db ' the number which is 100:$'DATAS ENDSCODES SEGMENTASSUMECS:CODES,DS:DATASMOV AX,DATASMOV DS,AXxor ax,axmov cx,9lea bx,scorecompare:cmp byte ptr[bx],60jl under60is60to69:cmp byte ptr [bx],70jl _60to69is70to79:cmp byte ptr[bx],80jl _70to79is80to89:cmp byte ptr [bx],90jl _80to89is90to99:cmp byte ptr [bx],100jl _90to99jz equal100under60:add num_under60,1 jmp con_60to69:add num_60to69,1 jmp con_70to79:add num_70to79,1 jmp con_80to89:add num_80to89,1 jmp con_90to99:add num_90to99,1 jmp conequal100:add num_100,1 con:lea bx,[bx+2]loop comparelast:huanhangshow string10 output num_under60 huanhangshow string20 output num_60to69 huanhangshow string30 output num_70to79 huanhangshow string40 output num_80to89 huanhangshow string50output num_90to99 huanhangshow string60 output num_100 huanhangmov ah,4chjmp functionCODES ENDS tongji endp CODES ENDS END START五、总结本次大作业采用汇编语言编写一比较大型的程序,采用数组、栈等形式进行操作,从开始设计到实现,我们复习到了课本上学到的知识,也对没有学到的图形和声音的应用领域有了一些涉猎。

学生成绩统计汇编语言 -回复

学生成绩统计汇编语言 -回复

学生成绩统计汇编语言-回复学生成绩统计是一项关系到学校管理、教育教学改革和个体学生发展的重要工作。

为了高效准确地进行学生成绩统计,一种高级语言—汇编语言的运用将大有裨益。

本文将以"学生成绩统计汇编语言"为主题,介绍如何利用汇编语言实现学生成绩统计的过程。

第一步:初始化在开始进行成绩统计之前,首先需要初始化相关变量和数据结构。

这包括学生数量、科目数量以及学生的成绩。

我们可以使用特定的数据结构来存储这些信息,如数组。

通过使用数组,我们可以将学生的成绩按照特定的规则存储起来,以便后续的统计操作。

第二步:输入学生信息和成绩在初始化阶段完成后,接下来需要输入学生的相关信息和成绩。

通过使用输入指令,我们可以从键盘读取学生的学号、姓名以及各科目的成绩,并将这些信息存储到之前初始化的数据结构中。

为了使程序更加易于理解和使用,我们可以为用户提供友好的界面来输入这些信息,并且对输入进行必要的格式检验和纠正。

第三步:计算总分和平均分一旦学生的信息和成绩都输入完成,我们可以开始进行具体的统计操作了。

首先,我们需要计算每个学生的总分和平均分。

通过遍历之前初始化的数据结构中的每个学生的成绩,我们可以将相应的科目成绩进行求和,并计算出总分和平均分。

第四步:排序学生成绩在计算出每位学生的总分和平均分后,我们可以按照特定的排序算法对学生成绩进行排序。

排序操作有助于将学生的成绩从高到低或从低到高进行排列,以便于之后的排名和分析。

第五步:输出成绩报告当学生成绩排序完成后,我们可以将结果输出成一份成绩报告。

这个报告可以包括每位学生的学号、姓名、各项科目成绩、总分和平均分,并按照特定的格式进行排版。

通过使用输出指令,我们可以将报告以文本或者其他形式展示给用户。

第六步:分析成绩数据在完成成绩报告输出之后,我们可以对学生成绩数据进行进一步的分析。

这包括计算全班或各科目的平均分、最高分和最低分,并制作相应的统计图表。

通过对成绩数据的分析,学校和教师可以更加直观地了解学生的学业发展和课堂教学效果,从而及时采取相应的措施进行调整和改进。

《汇编语言》实验报告

《汇编语言》实验报告

《汇编语言》实验报告实验名称:汇编语言实验报告实验目的:通过实验了解汇编语言的基本概念、语法结构和程序设计方法,掌握汇编语言的编写方法。

实验时间:2024年1月1日实验地点:实验室一、实验背景汇编语言是计算机硬件和软件之间的桥梁,通过汇编语言可以直接操作计算机的底层硬件。

汇编语言是一种低级语言,使用汇编语言可以实现对计算机内存、寄存器等硬件资源的直接操作,从而实现程序的功能。

本实验通过编写汇编语言程序,加深对汇编语言的理解。

二、实验过程1. 确定实验环境:使用DOSBox模拟DOS环境进行汇编程序编写和调试。

2. 编写第一个汇编程序:编写一个简单的汇编程序,将字符串“Hello, World!”输出到屏幕上。

3.程序分析:a.定义要输出的字符串,将字符串存储在数据段中。

b.设置段寄存器,将数据段地址加载到DS寄存器中。

c.设置显示模式和光标位置。

d.将字符串逐个字符输出到屏幕上。

e.关闭显示模式。

4. 编译运行:使用汇编语言的编译器将汇编程序转换成机器码,并在DOSBox中运行程序。

5.调试程序:根据程序运行结果和分析,调试程序中存在的错误,并进行改正。

三、实验结果与分析经过多次编写和调试,我们成功实现了将字符串“Hello, World!”输出到屏幕上的功能。

通过程序分析和调试过程,加深了对汇编语言的理解和掌握。

四、实验总结通过本次实验,我们深入了解了汇编语言的基本概念、语法结构和程序设计方法。

通过实际编写汇编语言程序,对汇编语言的编写方法有了更加深入的认识。

同时,通过调试程序的过程,我们也提高了自身的问题解决能力和分析能力。

在今后的学习和工作中,我们将继续学习和深入研究汇编语言,提高自己的编程能力和创新思维能力。

总体而言,本次实验给我们带来了很大的收获,我们以后将更加努力地学习汇编语言,提高自己的编程水平,为以后的学习和工作做好充分的准备。

汇编语言求学生总成绩

汇编语言求学生总成绩

西南交通大学信息科学与技术学院2008年7月实验三求学生总成绩一、实验要求从键盘上输入若干个学生(总数不超过500人)的姓名(英文字母不超过8个)及其5门课程的总成绩(百分制),输出任意名次的学生的姓名及其5门课程的总成绩(按总成绩高低排序,总成绩最高者为第一名)。

(1)画出满足上述要求的流程图(2)写出源程序及相应代码(3)写出满足上述要求的实验报告二、实验步骤1、创建源程序文件和工程文件。

2、输入源程序,并保存到源程序文件。

3、对源程序进行编译,查找并修改错误。

4、建立工程,运行工程文件。

5、对工程文件进行调试。

三、实验分析及流程图程序分析:先从键盘输入总的学生数,然后输入学生姓名,成绩。

用插入排序和名次索引数组,每输入一个学生的成绩(输入后转化为2进制)后就进行排序。

比如输入第i个学生的成绩后,将第i个学生的成绩与第0到i-1个学生的成绩一次比较,如果前者大,则后者的名次自加1,用一个变量point来记录总的自加数,比较完后第i个学生的名次就是总个数-point。

学生的姓名和成绩都输入完毕后,从键盘输入名次,从名次数组中查找与之一样的,返回下标,若没有,返回-1。

然后将返回下标对应的姓名输出,对应的成绩转化为字符串后输出。

程序流程图:子程序inone流程图jargeproc 流程图: cz 流程图:主程序流程图:exchange流程图:程序源代码: data segmentmsg1 db "Please input the number of the students:$" student db 500 dup(10,?,10 dup(0)) scole dw 500 dup(0)list dw 500 dup(0)msg2 db "Please input the name of the student:$" msg3 db "Please input the scole of the student:$" enmsg db 0ah,0dh,0ah,0dh,'$'msg4 db "Please input the mingci:$"scol db 0,0,0,'$'result db "No found!$"num dw 0point dw 0point1 dw 0data endsstack segment para stackdb 40h dup(0)stack endscode segmentassume cs:code,ss:stack,ds:datastart:mov ax,datamov ds,axlea dx,msg1mov ah,09hint 21hcall numprocmov num,bxmov cx,0mov di,cxlop:lea dx,enmsgmov ah,09hint 21hlea dx,msg2mov ah,09hint 21hmov di,cxcall nameprocadd cx,08hlea dx,enmsgmov ah,09hint 21hlea dx,msg3mov ah,09hint 21hcall numprocxor ax,axmov ax,point1mov si,axadd si,simov bx,numcmp bx,point1jz next1jmp lopnext1:lea dx,enmsgmov ah,09hint 21hlea dx,msg4mov ah,09hint 21hmov di,cxlea dx,enmsgmov ah,09hint 21hcall exchangexor ax,axmov ax,cxmov bl,8mul blmov di,axlea dx,student[di]mov ah,09hint 21hlea dx,scolmov ah,09hint 21hjmp exitnext2:lea dx,resultmov ah,09hint 21hexit:mov ah,4chint 21h numproc procpush axpush cxpush dxmov bx,0lop1:mov ah,01hint 21hcmp al,0dhjz lop2xor ah,ahsub ax,30hmov cx,axmov ax,bxmov ch,10hmov bx,axadd bx,cxjmp lop1lop2:pop dxpop cxpop axretnumproc endp jargeproc procpush axpush bxpush cxxor ax,axxor bx,bxmov cx,point1mov si,cxadd si,simov ax,scole[si]mov bx,0mov point,0lop3:cmp cx,bxjz lop4mov si,bxadd si,sicmp ax,scole[si]js lop5mov di,bxinc list[bx+di]inc pointlop5:inc bxjmp lop3lop4:mov bx,cxsub bx,pointmov list[si],bx tpop dipop sipop cxpop bxpop axretjargeproc endpcz procxor cx,cxdec nummov cx,numlop6:mov si,cxadd si,sicmp list[si],bxjz nextsub cx,1js nextjmp lop6next:retcz endpexchange procpush axpush bxxor ax,axmov si,cxadd si,simov ax,scole[si]mov bl,10hdiv bladd ah,30hmov scol+2,ahxor ah,ahadd al,30hmov scol,almov scol+1,ahpop bxpop axretexchange endpinone procpush axllp:mov ah,01hint 21hcmp al,0dhinc dijmp llpexiti:mov student[di],byte ptr '$' inc dipop axretinone endpcode endsend start四、总结虽然这次实验借助了同学的帮助,但是从程序流程中和代码中还是学会了如何利用汇编语言的指令去实现分支结构,循环结构等等。

用汇编语言实现学生成绩统计分析

用汇编语言实现学生成绩统计分析

用汇编语言实现学生成绩统计分析编制一个程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。

1、成绩分等部分采用分支结构,统计所有成绩则用循环结构完成,显示统计结果采用DOS功能调用。

2、统计学生成绩和显示统计结果两部分内容用子程序结构来完成。

最佳答案 DATA SEGMENTSTRING1 DB 'Please Input Score:','$' ;提示输入STRING2 DB 'The Order From MAX T o MIN:','$';输出排序从大到小SCORE DW 60 DUP(0) ;分配存放空间S5 DW 0 ;定义变量S6 DW 0S7 DW 0S8 DW 0S9 DW 0S10 DW 0DATA ENDSSTACK SEGMENT ;堆栈段DW 64 DUP(0)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV DX,OFFSET STRING1 ;显示提示输入MOV AH,09HINT 21HXOR BX,BX ;寄存器清零XOR CX,CXXOR SI,SIXOR DI,DIINPUT: MOV AH,1 ;输入一个字符INT 21HCMP AL,0DH ;是否为回车键JZ OVER ;是就跳到OVERCMP AL,20H ;是否为空格JZ SAVE ;是就跳到SAVESUB AL,30H ;变为真数MOV CL,4SHL BX,CL ;左移四位,变为BCD码ADD BL,ALJMP INPUTSAVE: MOV SCORE[SI],BX ;保存到SCORE中ADD SI,2INC DIXOR BX,BXJMP INPUTOVER: MOV SCORE[SI],BX ;保存最后一个数据,并存放到SCORE中INC DIMOV DL,0AHMOV AH,02HINT 21HMOV CX,DIDEC CXXOR BX,BXCOMP1: MOV SI,2 ;指向下一个数MOV DX,CXCOMP2: MOV AX,SCORE[BX]CMP AX,SCORE[BX+SI] ;比较前后两个数JNC COMP3 ;小于就跳到COMP3XCHG AX,SCORE[BX+SI] ;交换位置MOV SCORE[BX],AXCOMP3: ADD SI,2 ;指向下一个数DEC DXJNZ COMP2ADD BX,2 ;指向下一个数LOOP COMP1MOV DX,OFFSET STRING2MOV AH,09HINT 21HSUB SI,SI ;把SI清零OUT_PUT1:MOV BX,SCORE[SI] ;输出百位数MOV DL,BHAND DL,0FHADD DL,30HMOV AH,02HINT 21HMOV DL,BL ;输出十位数MOV CL,4SHR DL,CLADD DL,30HMOV AH,02HINT 21HMOV DL,BL ;输出个位数AND DL,0FHADD DL,30HMOV AH,02HINT 21HMOV DL,20H ;输出空格MOV AH,02HINT 21HADD SI,2DEC DIOUT_PUT2:MOV BX,SCORE[SI] ;输出十位数MOV DL,BLMOV CL,4SHR DL,CLADD DL,30HMOV AH,02HINT 21HMOV DL,BL ;输出个位数AND DL,0FHADD DL,30HMOV AH,02HINT 21HMOV DL,20H ;输出空格MOV AH,02HINT 21HADD SI,2DEC DIJNZ OUT_PUT2MOV CX,10 ;设置计数器为10 MOV BX,OFFSET SCORECOMPARE: MOV AX,[BX] CMP AX,60 ;与60比较JL FIVE ;小于就跳到FIVE CMP AX,70 ;与70比较JL SIX ;小于就跳到SIXCMP AX,80 ;与80比较JL SEVEN ;小于就跳到SEVEN CMP AX,90 ;与90比较JL EIGHT ;小于就跳到EIGHTCMP AX,100 ;与100比较JNE NINE ;不为0就是90到99INC S10 ;100时【S10+1】JMP NEWDATA ;跳到NEWDATAFIVE: INC S5 ;小于60时【S5+1】JMP NEWDATA ;跳到NEWDATASIX: INC S6 ;大于等于60小于70时【S6+1】JMP NEWDATA ;跳到NEWDATASEVEN: INC S7 ;大于等于70小于80时【S7+1】JMP NEWDATA ;跳到NEWDATAEIGHT: INC S8 ;大于等于80小于90时【S8+1】JMP NEWDATA ;跳到NEWDATANINE: INC S9 ;大于等于90小于100时【S9+1】NEWDATA: ADD BX,2 ;取下个数LOOP COMPARE ;循环COMPAREMOV AH,4CH ;返回DOSINT 21HCODE ENDSEND START。

学生成绩管理系统设计实验(汇编语言)

学生成绩管理系统设计实验(汇编语言)

实验六学生成绩管理系统设计实验一、实验目的1、熟悉汇编语言程序结构;2、熟悉INT 21H的文件操作功能调用;3、熟悉INT 21H的1、9号功能和INT 10H常用功能的使用方法;4、掌握多子程序复杂问题程序设计方法;5、掌握利用汇编语言实现字符串的输入输出程序设计方法;6、了解多模块程序设计方法。

二、实验原理我们把可以多次调用、具有通用性、能完成特定功能的程序段编写成的独立程序模块称为子程序。

子程序是把一个程序划分成若干模块所用的主要手段,它便于独立设计、测试程序和编制程序文件。

三、实验内容1、实验要求设计一个学生成绩管理系统,要求完成文件建立、学生成绩录入、显示指定学号的学生记录、删除一个学生的记录、修改学生记录、返回等工作。

学生成绩包括学号(XH)、姓名(XM)、数学(SX)、语文(YW)、外语(WY)字段。

至少包括30名学生信息,每名学生学号字段为4个字符,姓名字段为15个字符(最大),每门成绩字段为3个字符(最大)。

程序设计步骤如下:1、编写主程序main.asm;2、编写文件创建子程序create,实现在指定盘指定文件夹“d:\chengji\2009\”下建立一个指定名称的文件2009doc.dat;3、编写成绩录入子程序append,实现在指定文件尾部插入一个学生的成绩记录;4、编写显示子程序display,实现按指定学号显示一个学生的记录;5、编写修改子程序modify,实现按指定学号修改一个学生的记录字段(不需修改直接回车);6、编写删除子程序,实现按指定学号、姓名删除一个学生的记录;7、编译、链接、调试,产生可执行文件main.exe。

2、程序流程图3、程序代码程序代码如下:DATAS SEGMENTMSG1 DB '1. Append a record$'MSG2 DB '2. Display a record$'MSG3 DB '3. Modify a record$'MSG4 DB '4. Delete a record$'MSG5 DB '5. Create file$'MSG6 DB '6. Return DOS$'MSGC DB 'Please input 1--6:$'MSGE DB 'Error!$'MSGC1 DB 'Please input filename:$'MAXLEN DB 25ACTLEN DB ?STRING DB 25 DUP(?)MAXLEN1 DB 25ACTLEN1 DB ?STRING1 DB 25 DUP(?)PATHNM DB 'D:\chengji\2009\\',23 DUP(?)PATH DB 'D:\chengji\2009\2009doc.dat',00MSGA1 DB 'Please input XH:$'MSGA2 DB 'Please input XM:$'MSGA3 DB 'Please input SX:$'MSGA4 DB 'Please input YW:$'MSGA5 DB 'Please input WY:$'HANDLE DW ?MSGXH DB 'Xuehao: $'MSGXM DB 'Xingming: $'MSGSX DB 'Shuxue:$'MSGYW DB 'Yuwen: $'MSGWY DB 'Waiyu: $'BUFFER DB 2048 DUP(' ')MSGRT DB 'Press any key to return!$'DELSTR DB 33 DUP(' ') DATAS ENDSSTACKS SEGMENT STACKDB 256 DUP(?)STACKS ENDS CODES SEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;******************************** ;主程序MAIN PROC FARS:;清屏CALL CLS ;逐行输出提示信息MOV AH,02HMOV DH,9MOV DL,30INT 10HMOV AH,9LEA DX,MSG1INT 21HMOV AH,02HMOV DH,10MOV DL,30INT 10HMOV AH,9LEA DX,MSG2INT 21HMOV AH,02HMOV DH,11MOV DL,30INT 10HMOV AH,9LEA DX,MSG3INT 21HMOV AH,02HMOV DH,12MOV DL,30INT 10HMOV AH,9LEA DX,MSG4INT 21HMOV AH,02HMOV DH,13MOV DL,30INT 10HMOV AH,9LEA DX,MSG5INT 21HMOV AH,02HMOV DH,14MOV DL,30INT 10HMOV AH,9LEA DX,MSG6INT 21H;提示输入MOV AH,02HMOV DH,15MOV DL,30INT 10HMOV AH,9LEA DX,MSGCINT 21H;从键盘读入一个数字MOV AH,02HMOV DH,15MOV DL,48INT 10HMOV AH,1INT 21H;按数字对应子程序CMP AL,31HJZ CAPPENDCMP AL,32HJZ CDISPLAYCMP AL,33HJZ CMODIFYCMP AL,34HJZ CDELETECMP AL,35HJZ CCREATECMP AL,36HJZ E;若输入不是1-6数字,则提示错误MOV AH,02HMOV DH,16MOV DL,30INT 10HMOV AH,9LEA DX,MSGEINT 21HCCREATE:CALL CREATEJMP SCDELETE:CALL DELETEJMP SCMODIFY:CALL MODIFYJMP SCDISPLAY:CALL DISPLAYJMP SCAPPEND:CALL APPENDJMP SE:MOV AH,4CHINT 21HMAIN ENDP;******************************** ;CREATE程序CREATE PROC NEARPUSH AXPUSH CXPUSH DXPUSH SIPUSH DI;清屏CALL CLS;提示输入文件名MOV AH,2MOV DH,12MOV DL,20INT 10HMOV AH,9LEA DX,MSGC1INT 21H;从键盘读入文件名字符串MOV AH,0AHLEA DX,MAXLENINT 21H;将文件名字符串加到ASCIZ字符串末尾MOV CX,0MOV CL,ACTLENLEA SI,STRINGLEA DI,PATHNMADD DI,16LCREATE:MOV AL,BYTE PTR [SI]MOV [DI],ALINC DIINC SILOOP LCREATE;在ASCIZ字符串末尾加00MOV BYTE PTR [DI],0;按ASCIZ字符串创建文件MOV AH,3CHLEA DX,PATHNMMOV CX,0INT 21HPOP DIPOP SIPOP DXPOP CXPOP AXRETCREATE ENDP;******************************** ;APPEND程序APPEND PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DI;清屏CALL CLS;打开文件(只写)MOV AH,3DHMOV AL,01HLEA DX,PATHINT 21HMOV HANDLE,AX;提示输入学号MOV AH,02HMOV DH,10MOV DL,30INT 10HMOV AH,9LEA DX,MSGA1INT 21H;从键盘读入字符串MOV AH,0AHLEA DX,MAXLENINT 21H;在字符串末尾补足空格MOV DX,4CALL FILL;将文件指针定位至文件末尾MOV AH,42HMOV AL,2MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;写入文件MOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;提示输入姓名MOV AH,02HMOV DH,11MOV DL,30INT 10HMOV AH,9LEA DX,MSGA2INT 21H;从键盘读入字符串MOV AH,0AHLEA DX,MAXLENINT 21H;在字符串末尾补足空格MOV DX,15CALL FILL;将文件指针定位至文件末尾MOV AH,42HMOV AL,2MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;写入文件MOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;提示输入语文成绩MOV AH,02HMOV DH,12MOV DL,30INT 10HMOV AH,9LEA DX,MSGA3INT 21H;从键盘读入字符串MOV AH,0AHLEA DX,MAXLENINT 21H;在字符串末尾补足空格MOV DX,3CALL FILL;将文件指针定位至文件末尾MOV AH,42HMOV AL,2MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;写入文件MOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;提示输入数学成绩MOV AH,02HMOV DH,13MOV DL,30INT 10HMOV AH,9LEA DX,MSGA4INT 21H;从键盘读入字符串MOV AH,0AHLEA DX,MAXLENINT 21H;在字符串末尾补足空格MOV DX,3CALL FILL;将文件指针定位至文件末尾MOV AH,42HMOV AL,2MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;写入文件MOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;提示输入外语成绩MOV AH,02HMOV DH,14MOV DL,30INT 10HMOV AH,9LEA DX,MSGA5INT 21H;从键盘读入字符串MOV AH,0AHLEA DX,MAXLENINT 21H;在字符串末尾补足空格MOV DX,3CALL FILL;在字符串末尾加回车、换行INC SIMOV BYTE PTR [BX+SI],0DHINC SIMOV BYTE PTR [BX+SI],0AHADD ACTLEN,2;将文件指针定位至文件末尾MOV AH,42HMOV AL,2MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;写入文件MOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;关闭文件MOV AH,3EHMOV BX,HANDLEINT 21HPOP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETAPPEND ENDP;******************************** DISPLAY PROC NEARPUSH AXPUSH DX;清屏CALL CLS;提示输入学号MOV AH,02HMOV DH,10MOV DL,28INT 10HMOV AH,9LEA DX,MSGXHINT 21H;从键盘读入学号字符串MOV AH,0AHLEA DX,MAXLENINT 21H;打开文件(只读)MOV AH,3DHMOV AL,00HLEA DX,PATHINT 21HMOV HANDLE,AX;将文件指针定位至文件开头MOV AH,42HMOV AL,0MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;将文件载入缓存MOV AH,3FHMOV BX,HANDLEMOV CX,2048LEA DX,BUFFERINT 21H;在缓存中找到对应记录LEA SI,BUFFERLEA DI,STRINGMOV CX,AXCALL SEARCHCMP DX,0JZ OUTPUT;若未找到,则提示错误MOV AH,9LEA DX,MSGEINT 21HJMP DEND;显示对应信息OUTPUT:MOV AH,02HMOV DH,11MOV DL,28INT 10HMOV AH,9LEA DX,MSGXMINT 21HADD SI,5MOV AH,9MOV DX,SIINT 21HMOV AH,02H MOV DH,12 MOV DL,28INT 10HMOV AH,9LEA DX,MSGYW INT 21HADD SI,16MOV AH,9MOV DX,SIINT 21HMOV AH,02H MOV DH,13 MOV DL,28INT 10HMOV AH,9LEA DX,MSGSX INT 21HADD SI,4MOV AH,9MOV DX,SIINT 21HMOV AH,02H MOV DH,14 MOV DL,28INT 10HMOV AH,9LEA DX,MSGWY INT 21HADD SI,4MOV AH,9MOV DX,SIINT 21HMOV AH,2MOV DH,15MOV DL,28INT 10HMOV AH,9LEA DX,MSGRTINT 21HMOV AH,1INT 21HDEND: ;关闭文件MOV AH,3EHMOV BX,HANDLEINT 21HPOP DXPOP AXRETDISPLAY ENDP;******************************** MODIFY PROC NEARPUSH AXPUSH DX;清屏CALL CLS;提示输入学号MOV AH,02HMOV DH,10MOV DL,28INT 10HMOV AH,9LEA DX,MSGXHINT 21H;从键盘读入学号字符串MOV AH,0AHLEA DX,MAXLENINT 21H;打开文件(读写)MOV AH,3DHMOV AL,10LEA DX,PATHINT 21HMOV HANDLE,AX;将文件指针定位至文件开头MOV AH,42HMOV AL,0MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;将文件载入缓存MOV AH,3FHMOV BX,HANDLEMOV CX,2048LEA DX,BUFFERINT 21H;在缓存中找到对应记录LEA SI,BUFFERLEA DI,STRINGMOV CX,AXCALL SEARCHCMP DX,0JZ REVISEXM;若未找到,则提示错误MOV AH,9LEA DX,MSGEINT 21HJMP MEND;修改姓名REVISEXM:MOV AH,02HMOV DH,11MOV DL,28INT 10HMOV AH,9LEA DX,MSGXMINT 21HMOV AH,0AHLEA DX,MAXLENINT 21HCMP BYTE PTR [STRING],0DH ;若为回车,则将指针指向下一字段JNZ XMCONTADD SI,5JMP REVISEYWXMCONT:PUSH SIMOV DX,15CALL FILLPOP SIADD SI,5LEA BX,BUFFERMOV DX,SISUB DX,BXMOV AH,42HMOV AL,00MOV BX,HANDLEMOV CX,00INT 21HMOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;修改语文成绩REVISEYW:MOV AH,02HMOV DH,12MOV DL,28INT 10HMOV AH,9LEA DX,MSGYWINT 21HMOV AH,0AHLEA DX,MAXLENINT 21HCMP BYTE PTR [STRING],0DHJNZ YWCONTADD SI,16JMP REVISESXYWCONT:PUSH SIMOV DX,3CALL FILLPOP SIADD SI,16LEA BX,BUFFERMOV DX,SISUB DX,BXMOV AH,42HMOV AL,00MOV BX,HANDLEMOV CX,00INT 21HMOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;修改数学成绩REVISESX:MOV AH,02HMOV DH,13MOV DL,28INT 10HMOV AH,9LEA DX,MSGSXINT 21HMOV AH,0AHLEA DX,MAXLENINT 21HCMP BYTE PTR [STRING],0DHJNZ SXCONTADD SI,4JMP REVISEWYSXCONT:PUSH SIMOV DX,3CALL FILLPOP SIADD SI,4LEA BX,BUFFERMOV DX,SISUB DX,BXMOV AH,42HMOV AL,00MOV BX,HANDLEMOV CX,00INT 21HMOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21H;修改外语成绩REVISEWY:MOV AH,02HMOV DH,14MOV DL,28INT 10HMOV AH,9LEA DX,MSGWYINT 21HMOV AH,0AHLEA DX,MAXLENINT 21HCMP BYTE PTR [STRING],0DHJZ MENDPUSH SIMOV DX,3CALL FILLPOP SIADD SI,4LEA BX,BUFFERMOV DX,SISUB DX,BXMOV AH,42HMOV AL,00MOV BX,HANDLEMOV CX,00INT 21HMOV AH,40HMOV BX,HANDLEMOV CX,0MOV CL,ACTLENLEA DX,STRINGINT 21HMEND: ;关闭文件MOV AH,3EHMOV BX,HANDLEINT 21HPOP DXPOP AXRETMODIFY ENDP;******************************** ******************************** **************DELETE PROC NEARPUSH AXPUSH DX;清屏CALL CLS;提示输入姓名MOV AH,02HMOV DH,11MOV DL,28INT 10HMOV AH,9LEA DX,MSGA2INT 21H;读入姓名字符串MOV AH,0AHLEA DX,MAXLEN1INT 21H;提示输入学号MOV AH,02HMOV DH,12MOV DL,28INT 10HMOV AH,9LEA DX,MSGA1INT 21H;读入学号字符串MOV AH,0AHLEA DX,MAXLENINT 21H;打开文件(读写)MOV AH,3DHMOV AL,10LEA DX,PATHINT 21HMOV HANDLE,AX;将文件指针指向开头MOV AH,42HMOV AL,0MOV BX,HANDLEMOV CX,0MOV DX,0INT 21H;载入文件MOV AH,3FHMOV BX,HANDLEMOV CX,2048LEA DX,BUFFERINT 21H;在缓存中搜索学号对应记录LEA SI,BUFFERLEA DI,STRINGMOV CX,AXCALL SEARCHCMP DX,0JNZ DELEND;比较该记录对应姓名是否与输入的相同PUSH SIADD SI,5LEA DI,STRING1MOV CX,0MOV CL,ACTLEN1MOV DX,0LCHECK:MOV AL,[SI]MOV AH,[DI]CMP AL,AHJZ LCONTIMOV DX,1JMP DELERRLCONTI:INC SIINC DILOOP LCHECKPOP SICMP DX,0JZ DEL;姓名不对应则提示错误DELERR:MOV AH,9LEA DX,MSGEINT 21HJMP DELENDDEL:;将文件指针定位至该记录开始处LEA BX,BUFFERMOV DX,SISUB DX,BXMOV AH,42HMOV AL,00MOV BX,HANDLEMOV CX,00INT 21H;将该记录覆盖为空格MOV AH,40HMOV BX,HANDLEMOV CX,33LEA DX,DELSTRINT 21HDELEND: ;关闭文件MOV AH,3EHMOV BX,HANDLEINT 21HPOP DXPOP AXRETDELETE ENDP;******************************** ;清屏程序CLS PROC NEARPUSH AXPUSH BXPUSH CXPUSH DX;屏幕初始化MOV AH,6MOV AL,0MOV BH,7MOV CX,0MOV DX,2479HINT 10H;重定位光标MOV DX,0MOV AH,2INT 10HPOP DXPOP CXPOP BXPOP AXRETCLS ENDP;******************************** ;搜索程序;若找到对应记录,则将DX赋为0,并将SI指向该记录首地址;否则DX 赋为1。

汇编语言综合实验

汇编语言综合实验

华北科技学院综合性实 验 报 告课程名称汇 编 语 言实验学期 2017 至 2018 学年 第 1 学期学生所在系部计算机学院网络工程系年级三年级专业班级网络B15- 学生姓名学号任课教师实验成绩计算机学院制《 汇 编 语 言》课程综合性实验报告开课实验室:基础实验室一 日期:2017年12月10日实验题目学生成绩排序一、实验目的进行汇编语言程序设计应用的综合性训练。

综合运用汇编语言循环程序、子程序、宏指令编程方法,提高汇编语言程序设计能力的应用水平。

序、宏指令编程方法,提高汇编语言程序设计能力的应用水平。

二、设备与环境PC 兼容机、Windows 操作系统、汇编程序masm for windows 2015 三、实验内容编写程序,接收从键盘输入某班学生的学号、姓名、成绩,对学生的成绩进行排序,最后把学号、姓名、学生成绩、名次显示出来。

排序,最后把学号、姓名、学生成绩、名次显示出来。

四、实验结果及分析⑴代码功能⑴代码功能该代码的功能是实现对已经输入的学生按成绩进行排序,输入时按学号输出时 按照成绩的由小到大输出,在成绩交换位置时成绩对应的姓名和学号也会跟随一起变 化使姓名和分数对应显示。

化使姓名和分数对应显示。

⑵变量的定义⑵变量的定义①缓冲区和存储单元的定义①缓冲区和存储单元的定义这个过程是个关键的过程,因为在程序中汇涉及到使用单元空间的单元值,如果这个过程是个关键的过程,因为在程序中汇涉及到使用单元空间的单元值,如果 不能明确的定义变量和缓冲区,在输入学生信息,输出学生信息都不能达到想要的效 果,而且在程序中执行循环时也会因为赋值不准确导致程序出现错误,而且这种错误 系统不会提示,这就意味着查找问题很困难,增加了编码的难度和工作量。

系统不会提示,这就意味着查找问题很困难,增加了编码的难度和工作量。

②宏定义及其使用②宏定义及其使用在进行编码时为了使代码量减少,应该适当定义一些宏,此程序定义了在进行编码时为了使代码量减少,应该适当定义一些宏,此程序定义了 5 个宏,个宏, hong1 实现的功能是定义了回车换行因为在对学生成绩输出时会用到换行而且是反实现的功能是定义了回车换行因为在对学生成绩输出时会用到换行而且是反 复的使用,因此定义回车换行的宏可以减少一定的代码量。

北京交通大学_汇编语言程序设计实验报告

北京交通大学_汇编语言程序设计实验报告

统计学生成绩实验报告
姓名:XXX 学号:XXX 班级:XXX
任课教师:李济生
一、实验目的与要求
1.熟悉汇编语言各种跳转指令的功能和用法。

2.学会用程序流程图来分析和设计分支程序。

3.通过顺序和分支结构来熟悉汇编语言程序设计的主要方法。

4.了解和掌握程序设计过程中算法的选择。

二、实验内容
设有20个学生成绩分别56、78、67、40、87、99、63、51、74、100,90,80,68、88、55、66、84、96、45、73分。

编写程序实现统计低于60分、60-69分、70-79分、80-89分、90-99分及100分的人数,并分别存放在s5、s6、s7、s8、s9、s10单元中。

三、实验程序设计思路
实验思路用AX,BX,CX寄存器保存统计值,用SI寄存器保存数据地址,用类似IF-ELSE 的方法判断每一个数据属于哪一类
四、实验结果分析
1.存入数据
2. 将56与60比较,56<60,AX寄存器地位加一
3.增加SI,与第二个数比较
5.结果如下:依次为S5,S6,S7,S8,S9,S10
五、实验体会
通过本次实验我加深了对汇编分支程序的设计,更加深刻的理解了LEA,MOV,JAE,JNAE 等指令的使用。

熟悉了使用debug命令查看内存数据,对程序执行控制。

六、代码见附件
附件(实验代码,需要注释,所有的内容要规整):
同DEBUG环境实验的程序写法要求一样。

用汇编对学生-学号-成绩排序

用汇编对学生-学号-成绩排序

用汇编对学生-学号-成绩排序华北科技学院综合性实验报告课程名称汇编语言实验学期 XXXX 至 XXXX 学年第 X 学期学生所在系部计算机学院网络工程系年级 XXX 专业班级网络XXX班学生姓名 XXXX 学号 XXXXXXXXXXXXXXX 任课教师李冬艳实验成绩计算机学院制《汇编语言》课程综合性实验报告开课实验室:基础实验室二日期:XXXXXXXX2、程序的设计: 流程图提示所有数据录入必须有合法性判断。

键盘输入录入数据,根据录入数据满足以下要求,一是,必须是数字,二是,不能为0,小于9,这里是当一个数字为一个来处理的。

宏定义:宏定义主要用于将字符串进栈这一重复的过程中。

子程序键盘=0? 跳转到显示<=9跳转到跳转到跳转到显示ERROR 结束程序否否是 是子程序键盘进栈显示输入字排序:子程序NEXT 键盘输CX,BX,COUNT BUFF 地址传送COUNT 赋值给DI 自加2 Count 是 转到BX=COUNT 的COUNT 逻辑左AX= [BUFF+BX-4] [BUFF+BX]=AXAX=[BUFF+BX-2][BUFF+BX+2]=AXBH=[DI 转到BIG转到SAMLL DI 自加2 CX 自减1 转到P2CX 进栈 DI 自加1BH=[转到BIG2高低于等三、实验心得体会:本学期开设了汇编语言这门课程。

在课程的最后,我们迎来了汇编大实验。

在本学期的学习和做综合实验的过程中。

这学期通过学习汇编程序设计,是我认识到它是计算机语言里的第一个语言。

它有优点也有缺点,优点是它实际上是你计算机处理器实际运行的指令的命令形式表示法。

这意味着你将与处理器的底层打交道,比如寄存器和堆栈,能编写出比任何其他语言能实现的快得多的程序。

缺点是难学、语法晦涩、坚持效率,造成大量额外代码,移植性:接近零。

因为这门语言是为一种单独的处理器设计的,根本没移植性可言。

通过对这程序的制作,使我对汇编语言的基本知识的使用更加熟练,同时也增加了我对汇编语言的一些认识,在作业完成过程中通过和同学的交流,也增加了合作的技巧。

汇编语言显示学生名次表实验报告

汇编语言显示学生名次表实验报告

湖北科技学院计算机学院汇编语言课程设计课题题目:显示学生名次表学生姓名:学号:班级:2013年12 月26日一、实验目的进行汇编语言程序设计应用的综合性训练。

综合运用汇编语言循环程序和子程序编程方法,巩固提高汇编语言程序设计能力应用水平。

二、设备与环境PC兼容机、Windows操作系统、汇编程序masm for windows 2010三、实验内容实验内容:编制一程序,要求接收从键盘输入的一个班的学生成绩和学号,对学生的成绩进行排序,再按学号顺序和学生名次顺序分别把学生成绩显示出来。

四、实验结果及分析实验功能:从键盘输入学生姓名和成绩,按照成绩的高低排名显示输出。

程序中设定的名字是英文的,需要小于9位字母,学生人数为3个。

程序思路:1、本程序包括一个主程序和五个子程序。

子程序包括INPUT键盘输入、COPY数据转存、CHANGE十进制数ASCII码转二进制、SORT按成绩排序和PRINT打印班级名单。

2、用变量p控制输入的学生的个数。

本程序中,p=3。

3、姓名和成绩输入分别用DOS中被调用的10号功能实现字符串输入。

在输入最后字符后,要将回车符改为0,以便输出时直接用9号功能显示姓名和成绩。

4、用buffer1和buffer2作为键入的姓名和成绩的缓存区,然后将所有人名和成绩用串传送指令转到smane和score1中保存,打印输出是可以使用。

5、将score1中成绩的十进制数ASCII码转换为二进制数score2.6、将score2中的成绩排序,同时将保存在mingci中的输入次序号也一换,以次序号作为排序指针,在smane和score1中查找相应的人名和成绩。

7、打印排序名单时,从mingci中取出次序号作为位移量,到smane和score1中取出姓名和对应的成绩用9号功能显示。

排序后mingci中先取出的次序号一定是成绩最高的人的,其他类推。

程序代码、代码解析及流程图主程序:START:main proc farMOV AX,DATASMOV DS,AXmov es,axmov bx,0mov cx,0call inputcall sortcall printmov ah,4chint 21hmain endp数据段定义:DATAS SEGMENTinfor0 db 0ah,0dh,'sort= $'infor1 db 0ah,0dh,'input name: $'infor2 db 0ah,0dh,'input score:$'n equ 15 ;姓名长度m equ 4 ;成绩长度(3位+回车) p equ 4 ;输入的人数(4个q equ 3 ;成绩位数buff1 db n,?,n dup(0),'$';姓名缓冲区,加$以便输出buff2 db n,?,n dup(0),'$';成绩缓冲区sname db p dup(n+1 dup(0)) ;保存姓名score1 dw p dup(m+1 dup(0)) ;保存成绩score2 dw p dup(m+1 dup(0))mingci db p dup(0) ;名次x dw?sign1 dw 0sign2 dw 0cont db'1';计数DATAS ENDS子程序(INPUT) 1:输入姓名、成绩input procinc bx ;输入次数统计cmp bx,p ;输入次数ja exitlea dx,infor1 ;显示提示1mov ah,9int 21hlea dx,buff1 ;输入姓名mov ah,10int 21hmov al,buff1+1 ;实际输入个数,aladd al,2 ;+2,包含buffer1的0,1号单元mov ah,0mov si,ax ;回车od所在位置,跟在最后一个字符后mov buff1[si],0 ;将od换为0,便于输出显示lea dx,infor2 ;显示提示2mov ah,9int 21hlea dx,buff2 ;输入成绩mov ah,10int 21hmov al,buff2+1 ;实际输入个数add al,2 ;个数+2,包含0,1单元找到odmov ah,0mov si,axmov buff2[si],0 ;将od换为0,便于输出显示mov mingci[bx-1],bl ;bx为输入次数,保存输入次序cmp bx,1 ;第一次输入转let1jz let1add sign1,n+1 ;姓名间隔为n+1add sign2,q ;成绩间隔为qlet1:call copy ;子程序嵌套jmp inputexit:retinput endp流程图:→子程序2(COPY):数据转存copy procmov cx,n+1 ;姓名长度+1(包含$)lea si,buff1+2lea di,sname ;姓名传送到snameadd di,sign1 ;加上间隔值cldrep movsbmov cx,nmov ax,'$';用$覆盖姓名区,清除已输入的姓名lea di,buff1+2rep stosbmov cx,m+1 ;成绩位数+1(包含s)lea si,buff2+2lea di,score1 ;成绩传送到scoreladd di,sign2 ;加上间隔值cldrep movsblea si,buff2+2mov di,sign2call change ;二进制成绩,scorel2retcopy endp流程图:→子程序3(CHANGE):十进制数ASCII码→二进制change procmov x,0mov cx,[si-1] ;成绩的位数,cx and cx,000fh ;保留低4位rept2:mov al,[si] ;按位取出成绩cmp al,30h ;是否在0~9之间 jl exit1cmp al,39hjg exit1and ax,000fh ;去掉ASCII码xchg ax,xmov dx,10 ;将ax中前一次形成的数扩大10倍mul dxadd x,ax ;保存到xinc siloop rept2mov Array保存mov score2[di],ax ;二进制成绩送入mov x,0add sign2,2 ;下一个成绩单exit1: retchange endp流程图→子程序4(SPORT):按成绩排序sort procmov cx,p ;数组长度dec cxloop1:push cx ;保存外循环次数mov bx,0loop2:mov ax,score2[bx]cmp ax,score2[bx+m+1] ;m+1=5 jge next ;降序xchg ax,score2[bx+m+1];交换成绩mov score2[bx],axmov al,mingci[si]xchg al,mingci[si+1] ;交换成绩mov mingci[si],alnext:add bx,m+1 ;下一个成绩inc siloop loop2pop cx ;恢复外循环次数 loop loop1retsort endp子程序→子程序5(PRINT):打印排序名单print proclea dx,infor0 ;显示结果提示mov ah,9int 21hmov cx,pmov bx,0mov ax,0mov di,0rept3:mov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov dl,cont ;显示名次序号mov ah,2int 21hinc contmov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov ax,0mov al,mingci[di] ;取名次dec al ;位置-1,因为地址从0开始mov bl,9 ;姓名位置=al×9(包含$) mul bllea dx,snameadd dx,ax ;偏移地址+姓名位移量mov ah,9 ;显示名字int 21hmov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov ax,0mov bx,0mov al,mingci[di] ;取名次dec al ;地址从0开始mov bl,5 ;成绩位移量=al×5(包含$)mul bllea dx,score1add dx,ax ;显示成绩mov ah,9int 21hinc diloop rept3retprint endpcodes endsEND START运行结果:实验体会:在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。

汇编语言学生信息管理系统实验报告

汇编语言学生信息管理系统实验报告

微机原理技术与接口实验报告学院:专业:班级:姓名:学号:微机原理与接口技术试验实验目的掌握熟练汇编语言实验要求课本P119页31题实验环境文本编辑器,MASM5.0. windows7实验设计子程序名称及功能子程序调用关系图1、输入学生信息2、按学号排序输出3、按成绩排序输出4、统计并输出平均成绩5、统计并输出各分数段程序源代码(见附页)程序运行结果附页(源代码如下).model small;small,程序只能有一个代码段和一个数据段.stack 200h;堆栈段名stack,默认大小1024字节,这里是200h字节.data;数据段名_datastudent struc;学生的数据结构,32字节,2^5,便于计算地址xname db 14 dup('$')class db 14 dup('$')num dw 0score dw 0;为保存1位小数,以10倍值保存student endsstu_size equ 32;32=2^5stu_db student 100 dup(<'x','y',6,500>);100名学生的空间stu_num db 0;已保存的学生人数stu_seq db 100 dup('$');排序信息,排序操作在序列中进行,排序结果体现在序列中welcome db '==Student Information Mannagement System==',0dh,0ah; 打印菜单db'0. Add record.',0dh,0ah;0. 录入学生成绩(十进制形式)db'1. Sortby number.',0dh,0ah;1. 按学号排序显示db'2. Sortby score.',0dh,0ah;2. 按成绩排序显示db'3. Show Average',0dh,0ah;3. 统计平均成绩db'4. Show Statistics.',0dh,0ah;4. 统计各分数段人数db'5. Exit.',0dh,0ah;5. 退出db'$'msg1 db'name:','$'msg2 db'class:','$'msg3 db 'number:','$'msg4 db 'score:','$'m_str_l db 0dh,0ah,'[length<14byte] ','$'m_num_l db 0dh,0ah,'[value<100] ','$'table dw CASE0,CASE1,CASE2,CASE3,CASE4,CASE5buflen db 100;输入缓冲区大小100aclen db ?;实际输入长度buf db 100 dup(0),'$';实际缓冲区bufrear equ offset buf+100;缓冲区尾ns6 db 0;统计各分数段人数n67 db 0n78 db 0n89 db 0n91 db 0ms6 db 'failed:','$';显示各分数段人数m67 db '60~70:','$'m78 db '70~80:','$'m89 db '80~90:','$'m91 db '90~100:','$'.CODE;代码段名_textSTART:ps macro str;打印字符串,要求以'$'结尾push axpush dxlea dx,strmov ah,9int 21hpop dxpop axendmpc macro ch;打印字符push axpush dxmov dl,chmov ah,2int 21hpop dxpop axendmendl macro;打印'\n'pc 0dhpc 0ahendmscs macro;从键盘输入字符串,保存在buf中,串长aclen lea dx,buflenmov ah,10int 21hendmscc macro;从键盘输入字符,保存在almov ah,1int 21hendmmemcpy macro dest,src,len;经典的内存拷贝push axpush cxpush sipush dimov ax,dsmov es,ax;串操作di要用到附加段mov cl,lenmov ch,0lea si,srclea di,destcldrep movsb;mov [di],'$'pop dipop sipop cxpop axendm;使bx指向编号为ax的学生单元;寄存器:ax,bx,cxGET_STU macropush axpush cxlea bx,stu_dbmov cl,5shl ax,cladd bx,ax;bx指向这个学生的存储单元pop cxpop axendmmov ax,@datamov ds,axWELC:endlps welcomepc':';输入选项scc;ascii码保存在alendlmov ah,0mov bx,axsub bx,'0'cmp bx,5jbe CASE0TO5jmp WELCCASE0TO5:shl bx,1jmp table[bx];基址寻址CASE0:;录入学生成绩(十进制形式)call ins_stujmp WELCCASE1:;按学号排序显示call num_sortjmp WELCCASE2:;按成绩排序显示call score_sortcall print_seqjmp WELCCASE3:;统计平均成绩call get_averagejmp WELCCASE4:;统计各分数段人数call get_satjmp WELCCASE5:mov ah,4ch ;结束int 21h;ins_stu:输入学生信息;入口:stu_num已有学生人数,即最新空白编号;出口:stu_db;存储单元:stu_db,stu_numins_stu proc nearpush axpush bxpush cxpush dxmov al,stu_nummov ah,0;确定存放在第几个位置lea bx,stu_dbmov cl,5shl ax,cladd bx,ax;bx指向空白单元input_name:ps m_str_lps msg1scscmp aclen,14jae input_namememcpy [bx].xname,buf,aclenendlinput_class:ps m_str_lps msg2scscmp aclen,14memcpy [bx].class,buf,aclenendlps m_num_lps msg3scscall str2nummov [bx].num,axendlps m_num_lps msg4scscall score_fmtmov [bx].score,axendlinc stu_num;增加学生记录pop dxpop cxpop bxpop axretins_stu endp;pnum:以十进制形式输出一个无符号数;入口:ax需要输出的正数;出口:;存储单元:pnum proc nearpush axpush bxpush cxpush dxmov bx,bufreardec bxmov [bx],$OUTLOOP:or ax,axjz OUTLOOPFIN;ax为零mov dx,0mov cx,10div cxadd dl,'0'dec bxmov BYTE ptr [bx],dljmp OUTLOOPOUTLOOPFIN:cmp bx,offset bufrear-1;输出0jne PRINT_NUMdec bxmov BYTE ptr [bx],'0'PRINT_NUM:mov dx,bxmov ah,9int 21hpop dxpop cxpop bxpop axretpnum endp;pscore:以十进制形式输出带一位小数的分数;入口:ax需要输出的正数;出口:;存储单元:pscore proc nearpush axpush bxpush cxpush dxmov bx,bufrearOUTLOOP2:or ax,axjz OUTLOOPFIN2mov dx,0mov cx,10div cxadd dl,'0'dec bxmov BYTE ptr [bx],dljmp OUTLOOP2OUTLOOPFIN2:cmp bx,offset bufrear-1;x要改成0x,以便小数格式输出je S0Xcmp bx,offset bufrear;空要改成00,以便小数格式输出jne PRINT_SCORES00:;==,为空dec bxmov BYTE ptr[bx],'0'dec bxmov BYTE ptr [bx],'0' PRINT_SCORE:mov dx,bxmov bx,bufreardec bxmov cl,[bx];暂存小数mov [bx],$;movdx,bxmov ah,9int 21hpc '.'pc clpop dxpop cxpop bxpop axretpscore endp;pstu:输出学生信息;入口:ax存储编号;出口:;存储单元:pstu proc nearpush axpush bxpush cxGET_STUps msg1ps [bx].xname;pc ' 'ps msg2ps [bx].classpc ' 'ps msg3mov ax,[bx].numcall pnumpc ' 'ps msg4mov ax,[bx].scorecall pscoreendlpop cxpop axretpstu endp;str2num:将数字由字符串转成数值;入口:buf;出口:ax;存储单元:buf缓冲区,aclen缓冲区内容长度str2num procpush bxpush cxpush simov ax,0mov cl,aclenmov ch,0lea si,bufGET_NUM:;mov ax,dest;add dest,dest*10 + [si]-'0' mov bl,10mul bl;以前的数*10,乘法指令必须用axmov bl,[si]mov bh,0add ax,bxsub ax,'0'inc siloop GET_NUMpop sipop cxpop bxretstr2num endp;score_fmt:将分数格式存储;入口:buf;出口:ax;存储单元:buf缓冲区,aclen缓冲区内容长度score_fmt procpush bxpush cxpush dxpush simov ax,0mov cl,aclenmov ch,0mov dx,0lea si,bufGET_SCORE:cmp BYTE ptr [si],'.';这个类型很重要jnz MUL_DEX;不是小数点mov dx,1;发现小数点inc siloop GET_SCOREMUL_DEX:mov bl,10mul blmov bl,[si]mov bh,0add ax,bxsub ax,'0'inc siloop GET_SCOREcmp dx,0jnz END_SCOREmov bl,10mul blEND_SCORE:pop sipop dxpop cxpop bxretscore_fmt endp;get_average:算平均分并输出;入口:stu_db;出口;存储单元:stu_db,stu_numget_average proc nearpush axpush bxpush cxpush dxmov cx,0;学生编号mov ax,0;暂存平均成绩低8位mov dx,0;暂存平均成绩高8位REPERT:cmp cl,stu_numjae OUT_PUT;总分已经加完了;找到编号为cx的学生push axmov ax,cxGET_STUpop cxpop axadd ax,[bx].score;32位加法adc dx,0inc cljmp REPERTOUT_PUT:mov cl,stu_nummov ch,0or cl,0;假设学生人数不多于255人jnz END_AVE;没有学生,不能除0inc cxEND_AVE:div cx;扩展为16位除法,商保存在ax中endlcall pscoreendlpop dxpop cxpop bxpop axretget_average endp;get_sat:统计各分数段人数并输出;入口:stu_db;出口;存储单元:ns6,n67,n78,n89,n91,stu_db,stu_num get_sat proc nearpush axpush bxpush cxmov ns6,0mov n67,0mov n78,0mov n89,0mov n91,0mov cx,0;学生编号(人数-1)SAT_IN:cmp cl,stu_numjae SAT_OUT;已经完了;找到编号为cx的学生push cxmov ax,cxGET_STUpop cxpop axinc clmov ax,[bx].score cmp ax,600jb IS6cmp ax,700jb I67cmp ax,800jb I78cmp ax,900jb I89;>=90inc n91jmp SAT_INIS6:inc ns6jmp SAT_INI67:inc n67jmp SAT_INI78:inc n78jmp SAT_INI89:inc n89jmp SAT_INSAT_OUT:mov ah,0ps ms6mov al,ns6call pnumendlps m67mov al,n67call pnumendlps m78mov al,n78call pnumendlps m89mov al,n89call pnumendlps m91mov al,n91call pnumendlpop cxpop bxpop axretget_sat endp;print_seq:根据序列stu_seq输出列表;输入:stu_seq;输出:;存储单元:stu_seqprint_seq proc nearpush axpush bx;stu_seq保存了编号序列,以'$'结束lea bx,stu_seqPRINT_SEQ_BEGIN:mov al,[bx]cmp al,'$'jz PRINT_SEQ_ENDmov ah,0call pstuinc bxjmp PRINT_SEQ_BEGINPRINT_SEQ_END:pop bxpop axretprint_seq endp;num_sort:按学号排序;输入:stu_seq;输出:stu_seq;存储单元:num_sort proc nearpush bxpush dxmov dl,0lea bx,stu_seqSORT_BEGIN:cmp dl,stu_numjae SORT_ENDmov BYTE ptr [bx],dlinc bxinc dljmp SORT_BEGINSORT_END:mov BYTE ptr [bx],'$';stu_seq保存了按输入顺序的序列,以'$'结束cmp stu_num,1;学生数小于等于1,没必要排序jle NON_NUMmov cl,stu_num;循环次数,内存量不能直接减dec clmov ch,0LOOP1:mov di,cx;暂存外循环cxlea bx,stu_seq;指向第一个序号LOOP2:mov al,BYTE ptr [bx]mov ah,0push bxGET_STUmov dx,[bx].num;dx前一个序列号对应的学号pop bxmov al,BYTE ptr [bx+1]push bxGET_STUcmp dx,[bx].num;[bx].num后一个序列号对应的学号pop bxjae CONTImov al,BYTE ptr [bx];小于则交换两个序列号;callpnum;endlxchg al,BYTE ptr [bx+1];callpnum;endlmov BYTE ptr [bx],alCONTI:inc bx;下一个序列号loop LOOP2mov cx,di;恢复外循环loop LOOP1pop dxpop bxretnum_sort endp;score_sort:按成绩排序;输入:stu_seq;输出:stu_seq;存储单元:score_sort proc nearpush bxpush dxmov dl,0lea bx,stu_seqSCORE_BEGIN:cmp dl,stu_numjae SCORE_ENDmov BYTE ptr [bx],dlinc bxinc dljmp SCORE_BEGINSCORE_END:mov BYTE ptr [bx],'$';stu_seq保存了按输入顺序的序列,以'$'结束cmp stu_num,1;学生数小于等于1,没必要排序jle NON_SCOREmov cl,stu_num;循环次数,内存量不能直接减dec clmov ch,0SLOOP1:mov di,cx;暂存外循环cxlea bx,stu_seq;指向第一个序号SLOOP2:mov al,BYTE ptr [bx]mov ah,0push bxGET_STUmov dx,[bx].score;dx前一个序列号对应的学号pop bxmov al,BYTE ptr [bx+1]push bxGET_STUcmp dx,[bx].score;[bx].num后一个序列号对应的学号pop bxmov al,BYTE ptr [bx];小于则交换两个序列号;callpnum;endlxchg al,BYTE ptr [bx+1];callpnum;endlmov BYTE ptr [bx],alSCONTI:inc bx;下一个序列号loop SLOOP2mov cx,di;恢复外循环loop SLOOP1NON_SCORE:pop dxpop bxretscore_sort endpEND START(注:本资料素材和资料部分来自网络,仅供参考。

汇编学生成绩程序设计报告

汇编学生成绩程序设计报告

《汇编语言程序设计》综合程序设计实验报告题目:学生成绩管理系统一、项目简介此学生成绩管理系统实现了对学生成绩的基本管理功能,可以完成学生的显示,分数段人数统计,成绩排名以及插入查找等基本功能,并且成功实现了将学生信息写入文件以及从文件中读取的功能。

该项目运用了多个主程序的分支以及多个子程序,还有宏的定义和使用,基本涵盖了本学期所学知识,还应用了很多课外拓展的知识。

此项目是我们小组三人共同努力的结晶。

二、小组成员具体分工闫立新完成部分:主要完成程序的显示所有学生,文件的写入、读出和代码段定义部分。

王伟光完成部分:主要完成程序的所有学生排名,学生的查找、添加和代码段定义部分。

宋景超完成部分:主要完成程序的分数段统计,屏幕清屏、子程序和代码段定义部分。

三、需求分析与设计学生成绩管理系统,最基本的功能是实现最学生的显示和以及成绩的排名,和分数段的统计,以便分析教学效果。

我们的系统可以说完全达到了这个要求。

在这个系统的第一个功能就实现了所有学生的显示和他们对应的成绩。

此分支采用了内存存储单元中读取数据的方法,通过地址的不断增加来实现对学生姓名和成绩存储和输出。

统计学生分数段人数部分采用了多个跳转指令来实现,符合条件则使相应的分数段人数加1,不符合该分数段人数则跳转到相应的分数段并使该分数段人数加1。

对学生的排名,我们则选择了经典的冒泡排序来实现。

运用三条循环指令,lopi,lopj,lopk。

对学生的添加,我们设置了一个全局变量n来记录多少个数据,增加几个数据n就加几,然后输入姓名到新的内存中,输入成绩时因为成绩初始化时是以ASICC保存的,而输入的是字符,所以使用0FH现将其变成真正的数字然后通过*10等运算将其转化为ASICC即可对学生的查找,我们通过使用字符串比较来进行查找,使用bp来进行地址的改变,同时使用n5进行判断是否已经完成了查找已经是否找到了数据,找到数据则输出,找不到则输出错误文件的写入部分首先用dos指令3CH来创建一个文件,然后用dos指令40H 写入内容,在BX中装入文件代号,要写入的字节数放在CX中,输入缓冲区的地址放在DX中。

汇编---学生成绩排序综合实验报告

汇编---学生成绩排序综合实验报告
INT 21H
LOOP LET1
MOVBX,CONT;输出排名
CALL PUT
INCCONT;下一个名次
INCDI;DI指向下一个名次的序号
CLY
DECX;判断输出学生个数
JNZ SHUCHU1
PUT子程序
MOVAX,BX
MOVCX,0
MOVBX,10
SHUCHU2:
MOVDX,0
INCCX
IDIVBX;商存入AX,余数存入DX
MOVAL,RANK[DI];交换名次
XCHGAL,RANK[DI+1]
MOVRANK[DI],AL
NEXT:
ADDSI,2;SI指向下一个数
INCDI
LOOP PAIXU2
POPCX
LOOP PAIXU1
PRINT子程序
MOVBX,0
MOVCX,0
MOVDI,0
SHUCHU1:
MOVAX,0;取名次
INT 21H
LOOP LET0
MOVAX,0;取名次
MOVAL,RANK[DI]
DECAL
MOVBL,2
MULBL
LEASI,GRAND1
ADDSI,AX;算出对应成绩的开始位置
MOVBX,[SI];输出成绩
CALL PUT
MOVCX,8;输出空格,保证格式
LET1:
MOVAH,2
MOVDL,' '
LEADI,GRAND2
CLD
REP MOVSW
MOVCX,0
MOVCL,NUMBER;冒泡排序
DECCX
PAIXU1:
PUSHCX;保存外循环次数
LEASI,GRAND2

学生成绩统计汇编语言

学生成绩统计汇编语言

学生成绩统计汇编语言1. 引言学生成绩统计是学校管理和评估学生学习成果的重要工作之一。

为了高效地进行学生成绩统计,我们可以利用汇编语言来编写一个简单而有效的程序。

本文将介绍如何使用汇编语言来实现学生成绩的统计功能。

2. 程序设计思路我们将使用汇编语言来设计一个学生成绩统计程序,主要包括以下几个步骤: -输入学生信息和成绩; - 统计总分和平均分; - 输出成绩排名和各科目的最高分和最低分。

3. 程序实现步骤3.1 输入学生信息和成绩首先,我们需要定义一个数据结构来存储学生的信息和成绩。

可以使用数组或者结构体来实现。

每个学生的信息包括姓名、年龄、性别等,每个学生的成绩包括语文、数学、英语等科目。

student_info db "Tom", 18, "M"student_scores db 85, 90, 953.2 统计总分和平均分接下来,我们需要编写代码来实现对所有学生的总分和平均分的统计。

可以使用循环来遍历所有学生的成绩,并累加总分。

最后,将总分除以学生人数即可得到平均分。

mov ax, 0 ; 初始化总分为0mov cx, 0 ; 初始化学生人数为0loop_start:add ax, [student_scores] ; 累加总分add cx, 1 ; 学生人数加1add student_info, 3 ; 移动到下一个学生的信息add student_scores, 3 ; 移动到下一个学生的成绩cmp cx, num_of_students ; 判断是否遍历完所有学生jl loop_startdiv cx ; 将总分除以学生人数,得到平均分3.3 输出成绩排名和各科目的最高分和最低分最后,我们需要编写代码来输出成绩排名和各科目的最高分和最低分。

可以使用排序算法对学生成绩进行排序,并输出排名。

同时,也可以遍历所有学生的每个科目成绩,找出最高分和最低分。

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

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

0 ;修改时用的,判定是否找到相应学号 5,?,5 dup(0) ;为了使输入的分数也能输入错误的情况下回
退光标进行修改而用的 10,?,10 dup(0) ;删除时存储学号用的 0 ;总分数的高位 0 ;总分数的低位 0 ;学生的人数 0 ;平均成绩 0 ;小于 60 0 ;60 到 70 0 ;70 到 80 0 ;80 到 90 0 ;90 到 99
<7>
con
db 48 ;结构字段的大小,为常数
stu man 100 dup(<>) ;学生信息
(2) make_c proc 流程图:
<8>
make_c子程序
系统显示界面
1号系统调用 接收选择字符
是否为i
N
是否为l
N
是否为o
N
是否为s
N
是否为d
N
是否为m
Y
Y
Y 清屏,进入 插入界面
N 接收字符 并判断是否为c
<4>
3. 程序最终效果
主界面: 自己运行程序截图去吧
Insert(i)插入学生信息: 自己运行程序截图去吧
<5>
List(l)显示学生成绩: 自己运行程序截图去吧
Order(o)以分数进行从高到底排序: 自己运行程序截图去吧
Statistic(s)统计学生成绩分布: 自己运行程序截图去吧
Delete(d)删除学生信息(成功:Succesfully,失败:Failed): 自己运行程序截图去吧
输入姓名字符串并 保存
输入班级字符串 并保存
Call d_b 10转2进制子程序
返回到bx中
总分数低字加bx 高字加CF位

汇编语言综合实验报告

汇编语言综合实验报告

汇编语言综合实验报告一、引言在计算机科学领域,汇编语言是一种低级别的编程语言,用来直接控制计算机硬件。

汇编语言编写的程序可以直接访问计算机的内存和寄存器,因此在一些特定领域,如嵌入式系统开发和操作系统内核编程中得到广泛应用。

本实验旨在通过编写汇编语言程序,加深对计算机底层工作原理的理解,并提升编程技能。

二、实验目的本实验旨在掌握使用汇编语言编写程序的基本方法和技巧,通过实践将理论知识转化为实际应用能力。

具体目标如下:1. 理解汇编语言的基本结构和语法;2. 掌握寄存器的使用方法和常见指令的含义;3. 实现特定功能的汇编语言程序,并验证其正确性。

三、实验内容本次实验共包含三个实际问题,分别是:求两个整数的和、判断一个数是否为素数以及计算斐波那契数列中的第n项。

下面将分别介绍每个问题的解决方法和实现步骤。

1. 求两个整数的和要求编写一段汇编语言程序,输入两个整数,输出它们的和。

程序的具体实现步骤如下:(1)将第一个整数存入寄存器A;(2)将第二个整数存入寄存器B;(3)将寄存器A和寄存器B的值相加,结果存入寄存器C;(4)将寄存器C的值输出,作为程序的结果。

2. 判断一个数是否为素数要求编写一段汇编语言程序,输入一个整数,判断它是否为素数,并输出结果。

程序的具体实现步骤如下:(1)将待判断的整数存入寄存器A;(2)用2到sqrt(A)之间的所有整数去除A,如果能整除则判定为非素数,跳转到步骤(4);(3)将寄存器A的值输出,作为结果,并结束程序;(4)将“非素数”输出,作为结果,并结束程序。

3. 计算斐波那契数列中的第n项要求编写一段汇编语言程序,输入一个正整数n,计算斐波那契数列中的第n项,并输出结果。

程序的具体实现步骤如下:(1)将n存入寄存器A;(2)将寄存器A的值减1得到n-1,并将其存入寄存器B;(3)将寄存器A的值减2得到n-2,并将其存入寄存器C;(4)计算n-1和n-2这两个值对应的斐波那契数列项的值,分别存入寄存器D和寄存器E;(5)将寄存器D和寄存器E的值相加,结果存入寄存器F,并将寄存器F的值输出,作为程序的结果。

学生成绩统计汇编语言

学生成绩统计汇编语言

学生成绩统计汇编语言
学生成绩统计是一个常见的问题,使用汇编语言来实现这个功能需要考虑几个方面。

首先,我们需要定义学生成绩的数据结构,包括学号、姓名、各科成绩等信息。

然后,我们需要设计程序来输入和存储学生成绩数据,进行统计分析并输出结果。

在汇编语言中,我们可以使用文件操作指令来读取和写入学生成绩数据。

我们可以设计一个简单的数据库系统,使用文件来存储学生成绩信息,每条记录占据一定的空间,包括学号、姓名、各科成绩等字段。

我们可以使用汇编语言的文件操作指令来实现对这些数据的读取和写入。

另外,我们需要设计统计分析的算法。

比如,我们可以计算每个学生的平均成绩、最高成绩、最低成绩,或者计算每门课程的平均成绩、及格率等统计指标。

这些统计指标可以帮助老师和学生了解学生成绩的整体情况。

在汇编语言中,我们可以使用循环和条件判断指令来实现这些统计算法。

我们可以设计一个统计分析的子程序,用来对学生成绩数据进行遍历和计算,然后将结果输出到屏幕或者文件中。

总的来说,学生成绩统计的汇编语言程序需要考虑数据存储、
输入输出、统计算法等多个方面。

需要设计合理的数据结构和算法,以及合适的输入输出方式,来实现对学生成绩数据的有效管理和统
计分析。

汇编试验报告-学生信息管理系统

汇编试验报告-学生信息管理系统

学生信息管理系统1.实验类别使用汇编语言编程2.实验内容和实验目的学生的信息包括姓名、班级、学号和成绩,其中成绩精确到1位小数。

编写程序实现以下功能:(1)可以录入学生的信息,成绩以十进制形式录入,并显示;(2)可以按成绩进行排序显示;(3)可以统计平均成绩;(4)可以统计不及格、60~70、70~80、80~90、90~100各分数段的人数。

3.实验设备环境Windows 7 操作系统的pc 机,使用 QASM270编译器环境下编写。

4.实验实现过程及方法首先数据采用二维数组的形式进行存储,分为学生信息部分与成绩部分。

然后将输入学生数也保存在一个一维数组中。

然后再信息的存储过程中,对于字符串输入进行转换,以二进制的形式存储在数据段中。

然后采用冒泡排序,对于数据段中的人员信息进行排序。

以成绩为参数。

然后再对每个人员成绩进行遍历,统计各个数据层次中人员数,然后再成绩遍历的同时,将平均成绩也同时求出,在求平时成绩的时候,首先先将整数部分乘 10 然后再加上小数部分,以便于后续的输出。

将排序后的人员信息及成绩显示出来,然后将平均成绩也同时打印出来,还有各个分数层次中的人员数也都一并显示出来。

下面是一些主要代码来实现上述过程:; 数据部分NUMBER DB 3 DUP(0);第一个存个/ 十位 (ASCII码 ) ,第二个存个位(ASCII码 ) ,第三个存学生数( 二进制);用 20字节单元表示学生信息, 0-19 中: 0对应最大字符, 1对应实际输入, 2-18 对应输入信息, 19对应 '$'INFORMATION DB99 DUP(20 DUP(0)); 用 7字节单元来存分数, 0-6 中, 0-4 对应输入字符, 5对应输入整数部分的二进制数, 6 对应于小数部分的二进制数GRADE DB99 DUP(7 DUP(0))AVERAGE_GRADE_BUFFER DB 2 DUP(0);第一个存整数部分( 二进制形式) ,STORE_STUDENT_NUM; 存储学生总数, 结果送cx 中STORE_STUDENT_INFORMATION;存储学生信息STORE_STUDENT_GRADE存;储每个学生成绩SORT_DISPLAY ;;采用冒泡排序显示结果FIND_RESULT ;显示平均成绩和分段人数关键算法的流程图:关于分段人数与总成绩的计算冒泡排序算法:处理计算计算总成绩Y< 60?A++NY< 70?B++NY< 80?C++NY< 90?D++NY 处理排序冒泡i=0Ki<=Ki+1Y N交换i++N i=counte rY返回<=100E++N错误返回5.效果图输入三人信息,班级学好姓名,然后输入此人成绩。

汇编语言综合实验 --- 学生成绩排序(单链表实现)

汇编语言综合实验 --- 学生成绩排序(单链表实现)
②按学生的总成绩由高到低进行排序建立链表。
这一部分任务是按学生总成绩由高到低进行排序。采用单链表方式,给数据元素的链指针LINK字段装填数据,使LINK字段指向它的后继数据元素。步骤如下:
Ⅰ.初始时,数组元素的每个LINK字段值为0,表示数组元素没有被选中。扫描数组元素的SUM字段,从中找到第一个最大的数,将这个数组元素设置为链表的头,保存这个数组元素的位移量,并将其LINK字段设置为1,标记这个数组元素已被选中但尚未装填链指针。
重复上述步骤直到该结构体类型数组中的最后一个节点LINK字段置为1,该节点即为单链表的链尾。
③遍历单链表,即对学生成绩信息按总成绩由高到低输出。
首先将单链表的头指针赋值给BX,依次循环COUNT(学生人数)次输出每一个数组元素的值,每次输出结束后,将BX的值加上TYPE S_ARRAY(即加16字节),BX指向下一个数组元素的首地址。
②建立单链表,即完成对学生成绩信息的降序排列。
首先从所有数组元素中找出总成绩最大的一项,将该数组元素作为单链表的头指针,保存在DX中,同时将LINK字段赋值为1;
其次,从LINK字段为0的数组元素中找到总成绩最大的一项,将该数组元素的偏移地址作为前一节点的LINK字段值,同时将该节点的LINK字段值置为1;
图1-1程序主界面:
图1-2程序二级菜单界面:
2.排序功能的实现:
图1-2输入学生成绩界面:
图1-4按总分排序输出学生成绩信息:
3.设计思路:
(1)数据定义:
一个数据元素(一个学生的数据项)应该为一个结构类型,定义如下:
STUDENT STRUC;定义学生结构体
LINK DW 0;单链表指针,指向下一个节点偏移地址
Ⅰ.将链表的头元素的位移量送到BX寄存器。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华北科技学院综合性
实验报告
课程名称汇编语言
实验学期2011至2012学年第1学期学生所在系部计算机学院网络工程系
年级2009专业班级网络B091
学生姓名罗希学号200907024114任课教师李冬艳
实验成绩
计算机学院制
《汇编语言》课程综合性实验报告
开课实验室:软件一实验室2011年12月6日
实验题目显示学生名次表
一、实验目的
进行汇编语言程序设计应用的综合性训练。

综合运用汇编语言循环程序和子程序编程方法,巩固提高汇编语言程序设计能力应用水平。

二、设备与环境
PC兼容机、Windows操作系统、汇编程序masm611。

三、实验内容
编制一程序,要求接收从键盘输入的一个班的学生成绩,并存放于50字节的GRADE数组中,其中GRADE+N保存学号N+1的学生成绩。

然后根据GRADE中的学生成绩,把学生名次填入50字节的RANK数组中,其中RANK+N的内容是学号为N+1学生的名次。

再按学号顺序把学生成绩及学生名次显示出来。

1.必须画流程图。

2.本程序要求要有多重循环和子程序,其中成绩输入、计算学生名次、显示学生名次都分别用子程序,也可用宏处理。

四、实验结果及分析
本程序一共有5个子程序。

子程序分别是INPUT键盘输入,COPY数据转存,CHANG十进制数转换成二进制,SORT按成绩排序和PRINT打印排序名单。

输入界面:
价。

相关文档
最新文档