当前位置:首页 » 考试成绩 » 汇编语言统计学生成绩

汇编语言统计学生成绩

发布时间: 2021-01-07 06:38:34

『壹』 汇编语言实验 学生成绩名次表

课后题,我
30之间的数字0 - 100D中存储的地址GRADE为首的30阵列
级+1的学生数i + 1个学生的成绩。另一个数组RANK 30
;学生的名次,其中RANK +我的学生我+1内容的学生人数的排名。写一个程序,根据学生的成绩等级说话的学生排名填充的RANK阵列
(提示:学生得分高于数字加1)等于一个学生排名
DATAS分部
;输入的数据段代码
级DW 88,75,95,63,98,78,87,78,90,60;定义;结果
COUNT EQU($-GRADE)/ 2
> RANK DW COUNT DUP(1)排名中,初始值为1,首先,在同一起跑线上哈
DATAS结束

的STACKS分类
这里进入堆栈段码
STACKS ENDS

代码另一个矩形
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS MOV DS,AX
这里输入的代码段代码
MOV SI,0;学生把数
MOV CX,COUNT
L1:在
MOV AX,GRADE [SI]访问学生成绩SI号
RANK MOV BX,[SI];初步排名SI号学生

MOV DX, CX CX;保存
MOV DI,0;学生的比较数字
MOV CX,COUNT
L2:
CMP AX,GRADE [DI];比较苹果,苹果
> JNB L3
INC BX;以下学生的成绩,排名加1
L3:
ADD DI,2
LOOP L2

MOV RANK [ SI],BX;保存排名
ADD SI,2
MOV CX,DX
LOOP L1

MOV AH,4CH
INT 21H
> CODES ENDS END START

『贰』 用汇编语言实现:统计一班50名学生成绩的等级(A:90~100;B:80~89;C:70~79;D:60~69;E:60以下)

我编了一个,不知道怎么样呢?你看一下,在我的机器上它是正确的:用了DOC功能调用,方便输入嘛!不用BIOS了。。
DSEG SEGMENT
X DW 48;输入缓冲
Y DB 1 ;Y作为存放输出值的地方
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV CX,50
INPUT: MOV Y,1 ;输入错误提示Y的初始化
MOV AH,1
INT 21H
CMP AL,48
JB OUTPUT
CMP AL,57
JA OUTPUT
SUB AL,48
MOV DL,10 ;地一次的数乘上10
MUL DL
MOV X,AX
MOV AH,1
INT 21H ;两次调用中断输入,输入时不要按回车键
CMP AL,48
JB OUTPUT
CMP AL,57
JA OUTPUT
SUB AL,48
XOR AH,AH
ADD X,AX ;输入分数并进行有效行检验,然后转换为十进制数存在X里面
MOV Y,69
CMP X,60
JB OUTPUT ;输出等级的地方
MOV Y,68
CMP X,70
JB OUTPUT
MOV Y,67
CMP X,80
JB OUTPUT
MOV Y,66
CMP X,90
JB OUTPUT
MOV Y,65
OUTPUT: MOV DL,032
MOV AH,2
INT 21H
MOV DL,Y
MOV AH,2
INT 21H
MOV DL,09h ;空格开来
MOV AH,2
INT 21H
LOOP INPUT ;循环输入
MOV AH,4CH
INT 21H
CSEG ENDS
END START

『叁』 求解答,汇编语言如何设计10个学生成绩统计

; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr Endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF Endp
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_Save db 7 p(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码,
; 并送显示屏显示,未考虑四舍五入
; 入口:AH=二进制数,BH=除数,CX=保留小数位数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_Frac Proc Near
push ax
mov dl,'.'
call Output_Chr ;显示一个小数点
pop ax
mov bl,10 ;乘数
@@Dec_Frac: mov al,ah ;余数不为0,处理小数部分
mul bl ;余数乘10,继续做除法
div bh ;除以除数,取商数作为结果的一位小数
or al,30h
mov dl,al
call Output_Chr ;显示一位小数
loop @@Dec_Frac
ret
Dec_Frac EndP
; -------------------------------------
SCORE db 56,69,84,82,73,88,99,63,100,80 ; 成绩单
Elements equ ($-SCORE)/Type SCORE ;元素个数
RESULT db 6 p(0) ; 各分数段计数
SUM dw 0 ;总分
AVER db ? ;平均分
prompt_Res db '00---59: $'
prompt_Ave db 13,10,'Average: $' ;提示显示平均分
Press_Key db 13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
; -------------------------------------
; 统计低于60分、60-69、70-79、80-89、90-100各分数段人数并显示
lea si,SCORE ; 成绩首地址
mov cx,Elements ;成绩数目
mov dl,10 ; 用于除10
cld
@@Statics: lodsb ; 提取成绩
xor ah,ah
add SUM,ax ;累计总分
div dl ; 除10
cmp al,5 ; >5,及格
jg $+4
mov al,5 ; <=5,不及格
sub al,5 ; 减5,分数段计数地址偏移量
cbw ;
push ax
pop bx
inc RESULT[bx] ; 计数增1
loop @@Statics ; 循环,统计下一个成绩
mov al,RESULT[5] ;取100分人数
add RESULT[4],al ;加到90-100分数段
mov bl,59h
mov cx,5
lea si,RESULT ;各分数段计数数组首地址
lea dx,prompt_Res ; 统计结果字符串地址
List_Res: mov ah,9 ;显示分数段提示信息
int 21h
lodsb ;读入计数值
xor ah,ah
call Dec_ASCII ; 显示统计结果
call Output_CTLF ;输出一个回车、换行
mov al,bl
inc al
daa
mov bl,al
push cx
mov cl,4
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res,ax
mov al,bl
add al,9
mov bl,al
xor ah,ah
shl ax,cl
shr al,cl
or ax,3030h
xchg ah,al
mov WORD ptr Prompt_Res[5],ax
pop cx
loop List_Res
; -------------------------------------
; 计算并显示平均分
Output prompt_Ave ;提示显示平均分
mov bl,Elements
mov ax,SUM ;取总分
div bl ;平均分取整数部分
mov AVER,al ;保存平均分
xor ah,ah
call Dec_ASCII ;显示平均分
Exit_Proc: lea dx,Press_Key ;提示操作完成,按任意键结束程序
mov ah,9
int 21h
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

『肆』 用汇编语言程序编写程序 对不足250个学生成绩进行统计分析,统计出优秀,及格,和不及格的人数

data segment
DATA1 db 20 p(55),60 p(65),80 p(75),60 p(85),30 p(95) ;成绩表
DATA2 db 5 p(0) ;计数单元
;这里查找表,存储DATA2中计数单元索引
SORCE DB 60 p(4) ;0~59
DB 10 p(3) ;60~69
DB 10 p(2) ;70~79
DB 10 p(1) ;80~89
DB 11 p(0) ;90~100
data ends

CODE SEGMENT
ASSUME CS:CODE,DS:data
START:
MOV AX,data
MOV DS,AX
mov si,offset DATA1
xor ax,ax
mov cx,250 ;250个成绩
again:
lodsb ;读分数
mov di,ax ;di<=分数
mov al,byte ptr SORCE [di] ;计数单元索引
mov bx,ax
inc byte ptr DATA2[bx] ;计数加1
loop again
MOV AH,0
INT 16H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
这里统计的是100~90分,80~89分,70~79分,60~69分及<60分的人数存到DATA2单元。
你如果要统计出优秀,及格,和不及格的人数,只需改动一下SORCE的定义,如:
SORCE DB 60 p(2) ;0~59不及格
DB 25 p(1) ;60~84及格
DB 16 p(0) ;85~100优秀

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

DATA SEGMENT
STRING1 DB 'Please Input Score:','$' ;提示输入
STRING2 DB 'The Order From MAX To MIN:','$'
;输出排序从大到小
SCORE DW 60 DUP(0) ;分配存放空间
S5 DW 0 ;定义变量
S6 DW 0
S7 DW 0
S8 DW 0
S9 DW 0
S10 DW 0

DATA ENDS

STACK SEGMENT ;堆栈段
DW 64 DUP(0)
STACK ENDS

CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV DX,OFFSET STRING1 ;显示提示输入
MOV AH,09H
INT 21H

XOR BX,BX ;寄存器清零
XOR CX,CX
XOR SI,SI
XOR DI,DI

INPUT: MOV AH,1 ;输入一个字符
INT 21H
CMP AL,0DH ;是否为回车键
JZ OVER ;是就跳到OVER
CMP AL,20H ;是否为空格
JZ SAVE ;是就跳到SAVE
SUB AL,30H ;变为真数
MOV CL,4
SHL BX,CL ;左移四位,变为BCD码
ADD BL,AL
JMP INPUT

SAVE: MOV SCORE[SI],BX ;保存到SCORE中
ADD SI,2
INC DI
XOR BX,BX
JMP INPUT

OVER: MOV SCORE[SI],BX ;保存最后一个数据,并存放到SCORE中
INC DI
MOV DL,0AH
MOV AH,02H
INT 21H
MOV CX,DI
DEC CX
XOR BX,BX

COMP1: MOV SI,2 ;指向下一个数
MOV DX,CX

COMP2: MOV AX,SCORE[BX]
CMP AX,SCORE[BX+SI] ;比较前后两个数
JNC COMP3 ;小于就跳到COMP3
XCHG AX,SCORE[BX+SI] ;交换位置
MOV SCORE[BX],AX

COMP3: ADD SI,2 ;指向下一个数
DEC DX
JNZ COMP2
ADD BX,2 ;指向下一个数
LOOP COMP1

MOV DX,OFFSET STRING2
MOV AH,09H
INT 21H
SUB SI,SI ;把SI清零

OUT_PUT1:
MOV BX,SCORE[SI] ;输出百位数
MOV DL,BH
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H

MOV DL,BL ;输出十位数
MOV CL,4
SHR DL,CL
ADD DL,30H
MOV AH,02H
INT 21H

MOV DL,BL ;输出个位数
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H

MOV DL,20H ;输出空格
MOV AH,02H
INT 21H
ADD SI,2
DEC DI
OUT_PUT2:MOV BX,SCORE[SI] ;输出十位数
MOV DL,BL
MOV CL,4
SHR DL,CL
ADD DL,30H
MOV AH,02H
INT 21H

MOV DL,BL ;输出个位数
AND DL,0FH
ADD DL,30H
MOV AH,02H
INT 21H

MOV DL,20H ;输出空格
MOV AH,02H
INT 21H
ADD SI,2
DEC DI
JNZ OUT_PUT2

MOV CX,10 ;设置计数器为10
MOV BX,OFFSET SCORE

COMPARE: MOV AX,[BX]
CMP AX,60 ;与60比较
JL FIVE ;小于就跳到FIVE
CMP AX,70 ;与70比较
JL SIX ;小于就跳到SIX
CMP AX,80 ;与80比较
JL SEVEN ;小于就跳到SEVEN
CMP AX,90 ;与90比较
JL EIGHT ;小于就跳到EIGHT
CMP AX,100 ;与100比较
JNE NINE ;不为0就是90到99
INC S10 ;100时【S10+1】
JMP NEWDATA ;跳到NEWDATA
FIVE: INC S5 ;小于60时【S5+1】
JMP NEWDATA ;跳到NEWDATA
SIX: INC S6 ;大于等于60小于70时【S6+1】
JMP NEWDATA ;跳到NEWDATA
SEVEN: INC S7 ;大于等于70小于80时【S7+1】
JMP NEWDATA ;跳到NEWDATA
EIGHT: INC S8 ;大于等于80小于90时【S8+1】
JMP NEWDATA ;跳到NEWDATA
NINE: INC S9 ;大于等于90小于100时【S9+1】

NEWDATA: ADD BX,2 ;取下个数
LOOP COMPARE ;循环COMPARE

MOV AH,4CH ;返回DOS
INT 21H

CODE ENDS
END START

『陆』 利用汇编语言统计学生成绩,按优秀、良好、中等、及格、不及格加以区分

设内存中有一个字节数组SCORE,存有10个学生的考试成绩,编写多分支程序,统计大于(含等于,以下同)90分,大于80分,大于70分,大于60分,小于60分的人数,结果分别置于A、B、C、D、E字节单元。
.model small
.486
.stack
.data
score 70,86,90,45,60,96,100,65,72,87
count equ 10 ;总人数
score_E db ? ;0--59分人数
score_D db ? ;60--69分人数
score_C db ? ;70--79分人数
score_B db ? ;80--89分人数
score_A db ? ;90--99分人数
.code
.startup
lea bx, score
mov cx, count
again: mov al,[bx] ;取一个成绩
call tjrs ;调用统计分段人数
inc bx ;调整指针
loop again ;cx-cx-1,cx=0退出循环
.exit 0

tjrs proc ;统计分段人数
cmp al, 60
jae next0 ;al>= 60转
inc score_E ;al<60,0--59分的人数加1
jmp next4
next0: cmp al, 70
jae next1
inc score_D
jmp next4
next1: cmp al, 80
jae next2
inc score_C
jmp next4
next2: cmp al, 90
jae next3
inc score_B
jmp next4
next3: inc score_A
next4: ret
tjrs endp
end

『柒』 用汇编语言实现:统计一个班30个学生成绩的等级(A:90~100,B:80~89,C:70~79,D:60~69,E:60以下)。

;某班20名同学,编程序将全班优秀的成绩和不及格的成绩分别保存到两个数组。备注:成绩(是指包括学生姓名,学号和分数)
DATASEGMENT
chengjiDB'xiaoming','001',90,
'xiaofang','002',91,
'xiaomanj','003',45,
'xiaoke0h','004',23,
'xiaoheik','005',95
YOUXIUDB'excellent:',0ah,0dh,100DUP(0);优秀
BUJIGEDB'fail:',0ah,0dh,100DUP(0);不及格
DATAENDS
CODESEGMENT
ASSUMEDS:DATA,CS:CODE
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
LEASI,YOUXIU+10+2
LEADI,BUJIGE+4+2
LEABX,CHENGJI
MOVCX,5

LL1:MOVAL,[BX+11]
CMPAL,90
JAEYX
CMPAL,60
JaeNEXT
pushcx
movcx,8
N1:
moval,[bx]
mov[di],al
incbx
incdi
loopN1
movax,0d0ah;回车换行
mov[di],ax
movax,'$'
mov[di+2],ax
adddi,2
addbx,4
popcx
JMPloo
YX:
pushcx
movcx,8
N2:
moval,[bx];复制名字
mov[si],al
incbx
incsi
loopN2
movax,0d0ah
mov[si],ax
movax,'$'
mov[si+2],ax
addsi,2
addbx,4
popcx
jmploo
NEXT:
addbx,13
loo:
LOOPLL1

movah,09h
movdx,offsetYOUXIU
int21h
movdx,offsetbujige
int21h

MOVAH,4CH
INT21H

MAINENDP

;---------------------
;PROCNAMD:COPY
;FEATURE:
;INPUTPARAMTER:BUF1,BUF2,COUNT
;OUTPUTPARAMETER:NONE
COPYPROC

;MOVSI,OFFSETBUF1入口参数sitodi
;MOVDI,OFFSETBUF2
;MOVCX,COUNT入口参数:字节数
CLD
REPMOVSB
RET
COPYENDP
CODEENDS
ENDMAIN

}

『捌』 汇编语言统计学生各分数段人数

;以下和你要求的差不多,改改就可以用,有什么不懂得可以问我
data segment
credit dw 76,69,84,90,73,88,99,63,100,80
mes1 db '60-69:$'
mes2 db '70-79:$'
mes3 db '80-89:$'
mes4 db '90-99:$'
mes5 db '100:$'
v1 db ? ;60-69段人数计数器
v2 db ? ;70-79段人数计数器
v3 db ? ;80-89段人数计数器
v4 db ? ;90-99段人数计数器
v5 db ? ;100段人数计数器
data ends

code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
call count ;统计各分段人数的子程序
mov ah,4ch
int 21h
ret
main endp

count proc near
lea si,credit
mov cx,0ah
m1:mov bx,[si]
add si,2
cmp bx,60
jl m6
cmp bx,69
jg m2
inc v1
jmp m6 ;60-69
m2:cmp bx,79
jg m3 ;70-79
inc v2
jmp m6
m3:cmp bx,89
jg m4 ;80-89
inc v3
jmp m6
m4:cmp bx,99
jg m5 ;90-99
inc v4
jmp m6
m5:cmp bx,100
jg m6 ;100
inc v5
m6:loop m1

mov dx,offset mes1
mov ah,09h
int 21h

mov dl,v1
add dl,30h
mov ah,02h
int 21h
call crlf

mov dx,offset mes2
mov ah,09h
int 21h

mov dl,v2
add dl,30h
mov ah,02h
int 21h
call crlf

mov dx,offset mes3
mov ah,09h
int 21h

mov dl,v3
add dl,30h
mov ah,02h
int 21h
call crlf

mov dx,offset mes4
mov ah,09h
int 21h

mov dl,v4
add dl,30h
mov ah,02h
int 21h
call crlf

mov dx,offset mes5
mov ah,09h
int 21h

mov dl,v5
add dl,30h
mov ah,02h
int 21h
exit:
ret
count endp

crlf proc near ;回车换行子程序
mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
ret
crlf endp

code ends
end start

『玖』 【高分】帮忙用汇编语言做一个程序:学生成绩统计

; 程序操作说明:
; 1、本程序定义:姓名最多个20个字符,学号最多10个字符,成绩最多3位数字
; 2、输入学生信息时,各信息足位时,自动结束;不足位数时,按回车键结束
; 3、输入姓名时,若直接回车,表示结束学生信息输入,进入信息处理
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数的十进制数字,将其转换成二进制数并保存在指定的内存单元。
; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536
; 约定:直接回车,视为数字0
; 入口:@@Digits=数字位数;di=保存输入的数字首地址
; @@Type_Data=保存的数据类型,B=字节类型,W=字类型。
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KBBack
jz @@KB_Back ;若是回空键,重新输入
cmp al,'0'
jb @@KBBack ;若低于数字'0',重新输入
cmp al,'9'
ja @@KBBack ;若低于数字'9',重新输入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit: lodsb
cbw
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;字节类型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
ret
@@Digits db ? ;十进制数字位数
@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型
@@Save_Tmp db 16 p(?)
Input_Digit EndP
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[6]
mov BYTE ptr [di],'$'
dec di
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 p(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码,
; 并送显示屏显示,未考虑四舍五入
; 入口:AH=二进制数,BH=除数,CX=保留小数位数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_Frac Proc Near
push ax
mov dl,'.'
call Output_Chr ;显示一个小数点
pop ax
mov bl,10 ;乘数
@@Dec_Frac: mov al,ah ;余数不为0,处理小数部分
mul bl ;余数乘10,继续做除法
div bh ;除以除数,取商数作为结果的一位小数
or al,30h
mov dl,al
call Output_Chr ;显示一位小数
loop @@Dec_Frac
ret
Dec_Frac EndP
; -------------------------------------
Name_Length equ 20 ;姓名长度
ID_Length equ 10 ;学号长度
Info_Students Struc ; 学生信息结构类型
Name_Student db Name_Length p(?) ;姓名
ID_Student db ID_Length p(?) ;学号
Score_Student db ? ;成绩
Info_Students EndS
; -------------------------------------
Prompt_Str db 7,'Name',Name_Length-4+2 p(20h) ;姓名标题字符串
db 'Student ID',2 p(20h) ;学号标题字符串
db 'Score',CR,LF ;成绩标题字符串
db Name_Length p('-'),2 p(20h)
db ID_Length p('-'),2 p(20h)
db 5 p('-'),CR,LF,'$'
Temp_Cursor dw ? ;输入、显示学生信息光标位置
prompt_Ave db CR,LF,'Average: $' ;提示显示平均分
Buffer_Data db ?,?,Name_Length+2 p(?) ;姓名、学号输入缓冲区
Press_Key db CR,LF,CR,LF,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
mov @@Digits,3 ;十进制数字位数
mov @@Type_Data,'B' ;保存的数据类型。B=字节类型,W=字类型
; -------------------------------------
; 显示姓名、学号、成绩标题,提示输入学生信息
Output Prompt_Str
call GetCursor ;取光标位置
mov Temp_Cursor,dx ;保存输入、显示学生信息光标位置
; -------------------------------------
; 输入学生姓名、学号、成绩
lea di,Score_Table ;姓名、学号、成绩存放地址
Input_Name: call GetCursor ;取光标位置
mov Buffer_Data,Name_Length+1 ;允许输入的最多字符数
push di
lea di,Buffer_Data[2]
mov cx,(Name_Length+2)/2
mov ax,2020h ;填充空格
rep stosw
pop di
lea dx,Buffer_Data ;姓名输入缓冲区地址
mov ah,0ah
int 21h
lea si,Buffer_Data[1]
lodsb ;读入实际输入的字符个数
test al,al
jz @@L1 ;若输入学生姓名时,直接回车,认为学生姓名、学号、成绩等输入结束,转去计算输入的学生人数
mov cx,Name_Length ;姓名字符数
rep movsb ;写入学生信息缓冲区
add Cursor_Col,Name_Length+2 ;列号加姓名长度再加2,开始输入学号
call SetCursor ;置光标位置
push di
lea di,Buffer_Data[2]
mov cx,(Name_Length+2)/2
mov ax,2020h ;填充空格
rep stosw
pop di
lea dx,Buffer_Data ;学号输入缓冲区地址
mov ah,0ah
int 21h
lea si,Buffer_Data[2]
mov cx,ID_Length ;学号字符数
rep movsb ;写入学生信息缓冲区
add Cursor_Col,ID_Length+2 ;列号加学号长度再加2,开始输入成绩
call SetCursor ;置光标位置
call Input_Digit ;输入成绩
call Output_CTLF ;输出一个回车、换行
jmp Input_Name ;输入下一名学生信息
; -------------------------------------
; 计算输入的学生人数
@@L1: mov ax,di
sub ax,offset Score_Table ;所有学生信息所占内存容量
mov bl,type Info_Students ;每名学生信息所占内存容量
div bl
mov cx,ax ;CX=输入的学生人数
test cx,cx
jnz @@L00
jmp Exit_Proc ;若未输入任何信息,直接结束程序
; -------------------------------------
; 建立学生信息链表
@@L00: push di ;保存链表地址
lea ax,Score_Table ;学生信息起始地址
push cx
@@L2: stosw ;保存学生信息地址
add ax,type Info_Students ;每名学生信息所占内存容量
loop @@L2
pop cx
pop si ;弹出链表地址给si
cmp cx,2
jb Exit_Proc ;若只输入了1名学生的信息,则无须排序和显示结果
; -------------------------------------
; 用冒泡排序法按成绩降序排序
push si ;入栈保存链表地址
push cx ;保存学生人数
dec cx ;准备用冒泡排序法排序
@@Sorting: push cx ;入栈保存外循环次数
push si ;入栈保存数组地址
@@Compare: push si
pop di ;当前数组元素地址赋给目的变址寄存器,以备交换之用
lodsw ;将当前学生信息地址读入AX
mov bx,ax
mov al,[bx.Score_Student] ;将当前学生成绩读入AL
mov bx,[si] ;相邻的下一个学生信息地址
cmp al,[bx.Score_Student] ;当前学生成绩与相邻的下一个学生成绩相比较
jae @@NextOne ;若大于或等于,不作数据交换,处理下一个数组元素
mov ax,[di] ;若小于,读入当前学生信息链表节点
xchg ax,[si] ;交换链表元素
mov [di],ax ;保存数值较大者节点地址
@@NextOne: loop @@Compare ;处理下一个数组元素
pop si ;数组地址出栈
pop cx ;外循环次数出栈
loop @@Sorting ;下一趟比较
call Output_CTLF
; -----------------------------------------
; 按成绩降序显示所有学生信息
Output Prompt_Str ;显示学生信息标题
call GetCursor ;取光标位置
mov Temp_Cursor,dx ;保存显示学生信息光标位置
pop cx ;弹出学生人数
pop si ;弹出链表地址
push cx ;保存学生人数
xor bx,bx ;总成绩初值
@@List_Info: push cx ;保存学生人数
call GetCursor ;取光标位置
lodsw ;读入链表的一个节点
push si ;入栈保存链表地址
mov si,ax
push si ;入栈保存学生信息地址
lea si,[si.Name_Student] ;姓名地址
mov cx,Name_Length ;姓名字符串长度
@@Dsip_Name: lodsb ;读入一个字符
cmp al,0dh ;回车符?
jz @@L3 ;是,姓名显示结束
mov dl,al
call Output_Chr ;显示一个字符
loop @@Dsip_Name ;下一个字符
@@L3: add Cursor_Col,Name_Length+2 ;列号加姓名长度再加2,开始显示学号
call SetCursor ;置光标位置
pop si ;弹出学生信息地址
push si ;入栈保存学生信息地址
lea si,[si.ID_Student] ;学号地址
mov cx,ID_Length ;姓名字符串长度
@@Dsip_ID: lodsb ;读入一个字符
cmp al,0dh ;回车符?
jz @@L4 ;是,学号显示结束
mov dl,al
call Output_Chr ;显示一个字符
loop @@Dsip_ID ;下一个字符
@@L4: add Cursor_Col,ID_Length+2 ;列号加学号长度再加2,开始显示成绩
call SetCursor ;置光标位置
pop si ;弹出学生信息地址
lea si,[si.Score_Student] ;成绩地址
lodsb ;读入成绩
xor ah,ah
add bx,ax ;累加总成绩
call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
call Output_CTLF
pop si ;弹出链表地址
pop cx ;弹出学生人数
loop @@List_Info ;下一个节点(学生信息)
call Output_CTLF
; -------------------------------------
; 计算并显示平均分
Output prompt_Ave ;提示显示平均分
mov ax,bx
pop bx ;弹出学生人数
div bl ;平均分取整数部分
mov bh,ah ;保存余数
xor ah,ah
call Dec_ASCII ;显示平均分
mov ah,bh ;余数
mov bh,bl ;除数
mov cx,2 ;保留小数位数
call Dec_Frac ;把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Score_Table: ;学生成绩存储区
Code ENDS
END Start ;编译到此结束

热点内容
武汉大学学生会辅导员寄语 发布:2021-03-16 21:44:16 浏览:612
七年级学生作文辅导学案 发布:2021-03-16 21:42:09 浏览:1
不屑弟高考成绩 发布:2021-03-16 21:40:59 浏览:754
大学毕业证会有成绩单 发布:2021-03-16 21:40:07 浏览:756
2017信阳学院辅导员招聘名单 发布:2021-03-16 21:40:02 浏览:800
查询重庆2018中考成绩查询 发布:2021-03-16 21:39:58 浏览:21
结业考试成绩怎么查询 发布:2021-03-16 21:28:40 浏览:679
14中医医师资格笔试考试成绩查分 发布:2021-03-16 21:28:39 浏览:655
名著赏析课程标准 发布:2021-03-16 21:27:57 浏览:881
北京大学商业领袖高端培训课程 发布:2021-03-16 21:27:41 浏览:919