Finpoas子程序
开始 Ax,bx,cx清0 si<-point1*2,cx<-point1 ax<-scole[si],point<-0 Cx=bx? N Ax 开始 Cx<-num-1 Y list[cx*2]=bx? N Y Cx减1后<0? 结束 第 19 页 input函数 开始 将AX、BX、CX、BX进栈,清空将num送入CX,num=DX,DI=CX,BX=0,学生成绩送入AX 是 stu[bx].score>=stu[bx+12否 AX接收stu[bx+12].score的值 交换名字,并用string存储stu[bx+12]的名字 BX=BX-12; stu[bx].score>=TEMP? 是 把AX值给把AX的值给STU[BX+12] stu[bx].scor e把String的 值给stu[bx] 交换名字 BX=BX+12; 否 CX--=0? 第 20 页 BX=0? output函数 是 结束 开始 AX、BX、CX、DX、SI进栈,清空AX、BX、DX、SI ,调用renshu 通过输出函数输出msg4 DI是数组第NUM个存储单元的首地址 SI赋值为s数组的最后一个存储单元 DH=0,DL=10 stu[di].score 赋值AX 是 图3-5input子程序流程图 Al=0? 否 SI减1,清空 AH 增1,CX减1 MOV AL,[SI],SI 是 CX=3 Al=0? 否 CX减1,SI增 1 AH=AH+30H AX、BX、CX、 DX、SI出栈 结束 第 21 页 2、程序代码 图3-6output子程序流程图 data segment Student struct N db 9,0,9 dup(?) S dw ? Student ends Result db 0,0,0,'$' TenStudent student 10 dup({,20}) List dw 10 dup(0) Count dw -1 ;记录当前输入学生个数 Total dw 0 ;学生总人数 Score dw 0 ;学生分数 Tally dw 0 ;当前输入学生排名 Temp dw 0 ;临时保存数字 Flag dw 0 Msg1 db \Msg2 db \Msg3 db \Msg4 db \Msg5 db \Msg6 db \ Msg7 db \————the grade and name————$\EnMsg db 0ah,0dh,'$' data ends stack segment para stack db 100h dup(0) stack ends code segment assume cs:code,ss:stack,ds:data start: mov ax,data mov ds,ax Main:lea dx,Msg1 mov ah,09h int 21h Call Numproc ;输入学生人数并将人数存入Total mov Total,bx lea dx,Msg7 mov ah,09h int 21h lea dx,EnMsg mov ah,09h int 21h lea dx,EnMsg 第 22 页 mov ah,09h int 21h Add_Info: inc Count ;循环输入学生信息 Call Input ;调用输入信息函数 lea dx,EnMsg mov ah,09h int 21h mov ax,Count add ax,1 cmp ax,Total ;比较输入人数 jnz Add_Info Call Search ;按名次查找学生 Func: mov ah,4ch int 21h ;Input the Info of student Input proc ;输入学生信息函数 push ax push cx push dx lea dx,Msg3 mov ah,09h int 21h Call Numproc ;输入学生成绩 mov Score,bx ;Load the Score of the student mov bx,Count mov ax,bx mov cl,0dh mul cl mov bx,ax mov ax,Score mov TenStudent[bx].S,ax lea dx,Msg2 mov ah,09h int 21h lea dx,TenStudent[bx].N ;输入学生姓名 mov ah,0ah int 21h lea dx,EnMsg mov ah,09h int 21h mov TenStudent[bx].N+9,'$' Call FindPos ;更新排名映射数组 pop ax pop cx 第 23 页