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

汇编语言学生成绩

发布时间: 2021-03-03 07:02:47

A. 用汇编语言用汇编语言编写从键盘上输入N个学生的成绩,然后按成绩降序输出显示各学生的成绩。

学生成绩输出时是先输出成绩,再输出其序号。


CODESEGMENT
ASSUMECS:CODE
ORG100H
START:PUSHCS
POPDS
PUSHCS
POPES
CALLINPUTNUM
MOVAH,2
MOVDL,13
INT21H
MOVDL,10
INT21H

LEASI,@ARRAY
LEABP,@XUHAO
MOVCX,@NUM
CALLSORTWORD

LEASI,@ARRAY
LEABX,@XUHAO
MOVCX,@NUM
CLD
@1:
LODSW
CALLDSPAXS
MOVAX,[BX]
CALLDSPAXS
INCBX
INCBX
MOVAH,2
MOVDL,13
INT21H
MOVDL,10
INT21H
LOOP@1

MOVAH,4CH
INT21H


;===============================================
;键盘输入数值数组子程序(数组名为@array,元素个数存放在@num中)
;可以是负数
;采用字符串缓冲方式输入
INPUTNUMPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHF
;对数组@array清零
MOVCX,100
MOVAX,0
LEADI,@ARRAY
CLD
REPSTOSW
;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化序号数组
MOVCX,100
MOVAX,1
LEADI,@XUHAO
@WXUHAO:
STOSW
INCAX
LOOP@WXUHAO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOVWORDPTR@NUM,0
;输入的数据以一个空格分隔,以回车符结束输入
LEADX,@STRA
MOVAH,10
INT21H
MOVCL,@STRN
MOVCH,0
MOVWORDPTR@STRM,CX
LEASI,@STR
CLD

LEADI,@ARRAY;将数组第一个元素的有效地址置入DI
MOVWORDPTR@NUM,0
@STIN:
MOVAX,0
PUSHAX
MOVBYTEPTR@SIGNN,0
@AGAIN1:
CMPWORDPTR@STRM,0
JE@LINE0
LODSB
DECWORDPTR@STRM
CMPAL,''
JE@LINE0
CMPAL,'-'
JNE@INPUT1
MOVBYTEPTR@SIGNN,1
JMP@AGAIN1
@INPUT1:
SUBAL,30H
MOVAH,0
MOVBX,AX
POPAX
MOVCL,10
MOVCH,0
MULCX
ADDAX,BX
PUSHAX
JMP@AGAIN1
@LINE0:
POPAX
CMPBYTEPTR@SIGNN,1
JNE@INPUT2
NEGAX
@INPUT2:
MOVWORDPTR[DI],AX
INCWORDPTR@NUM
CMPWORDPTR@STRM,0
JE@STINEND
INCDI
INCDI
JMP@STIN
@STINEND:
POPF
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
RET
@STRADB255
@STRNDB?
@STRDB255DUP(?)
@STRMDW0
@ARRAYDW100DUP(0)
@NUMDW0
@CHARDB?
@SIGNNDB0
@XUHAODW100DUP(0)
INPUTNUMENDP
;===============================
;字数组排序(有符号数冒泡排序)
SORTWORDPROCNEAR
;数组长度置入cx,字数组首地址置入si,序号数组首地址置入bp
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHBP
PUSHF
PUSHCX
POPDX
DECDX
@SORTWL1:
MOVCX,DX
MOVDI,SI
MOVBX,BP
@SORTWL2:
MOVAX,[DI+2]
CMPAX,[DI]
JL@SORTWNEXT;从大到小(无符号换成JB)
XCHGAX,[DI]
MOV[DI+2],AX
;====================
MOVAX,[BX+2]
XCHGAX,[BX]
MOV[BX+2],AX
;====================
@SORTWNEXT:
INCDI
INCDI
INCBX
INCBX
LOOP@SORTWL2
DECDX
JNZ@SORTWL1
POPF
POPBP
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
RET
SORTWORDENDP

;=================================
DSPAXSPROCNEAR
PUSHAX
TESTAX,8000H
JNS@DSPAXS1
PUSHAX
PUSHDX
MOVAH,2
MOVDL,'-'
INT21H
POPDX
POPAX
NEGAX
@DSPAXS1:
CALLDSPAX
POPAX
RET
DSPAXSENDP
;===============================
DSPAXPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHF
XORCX,CX
MOVBX,10
@DSPAX1:
XORDX,DX
DIVBX
INCCX
ORDX,30H
PUSHDX
CMPAX,0
JNE@DSPAX1
MOVAH,2
@DISPAX2:
POPDX
INT21H
LOOP@DISPAX2
MOVDL,32
INT21H
POPF
POPDX
POPCX
POPBX
POPAX
RET
DSPAXENDP
;==================================
CODEENDS
ENDSTART

B. 汇编语言学生成绩排序

===缓冲区抄定义的例子===
BUF DB '256489713'
?EQU $-BUF

; ===起泡沫排序的代码示例===
LEA SI,BUF缓冲区地址
MOV CX,N的排序缓冲区的值的数目?
sss_lp1:
DEC CX BR /> JZ sss_out
推SI
推CX
sss_lp2:
MOV AL,[SI]
CMP AL,[SI +1]
JC sss_next
XCHG人[州市+1]
MOV [SI],AL
sss_next:
INC SI
循环sss_lp2
弹出CX
> POP SI
JMP sss_lp1
sss_out:;完成出口处,

C. 汇编语言实验 学生成绩名次表

课后题,我
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

D. 求用汇编语言 解决10个学生的平均成绩

data segment
buff db 30p(?);换成学生成绩
word0 db 0ah,0dh
db 'the thirty scores are:','$'
word1 db 0ah,0dh
db 'average scores is:','$'
data ends
code segment
assume cs:code ,ds:data
start:mov ax,data
mov ds,ax
mov dx,offset word0
mov ah,9
int 21h
mov dx,offset buff
mov ah,9
int 21h;输出成绩
mov ax,0
mov si,offset buff
clc
adc0:adc ax,word ptr [si]
inc si
loop adc0
mov bl,30
div bl
mov ah,0
div al,10;下面是实现10进制显示
mov dh,ah
mov dx,offset word1
mov ah,09h
int 21h

mov dl,al
mov ah,02h
int 21h
mov dl,dh
mov ah,02h
int 21h
mov ah,4ch
int 21h
code ends
end start

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

设内存中有一个字节数组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

F. 求汇编语言学生成绩管理

虽然不太懂,但按我的理解给你吧:
(真实姓名就不打了)
1 秋:1 地理:98、语文:专72、英语:95
2 地理:94、语文:68.5、英语:97
心:1 地理:68、语文:77 、英语:84
2 地理:73、语文:66 、英语:88
……两个为代表

2 部分成绩下降原因,睡眠不足,上课没精神、精力不集中,做作业速度慢。

3 ?

4 (1)秋属 (2)心

5 秋:265(平均:88)、259.5(平均:86)
心:229(平均:79)、226(平均:75)

6 秋:地理:96 语文:72。25 英语:96
心:地理:70。5 语文:71。5 英语:86

7 班上:55人
>=90:5 80~89:18 70~79:21 60~69 3 <=59:8

8 退出(?)

在电脑边打了40多分钟啊,体谅一下吧!

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

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

H. 汇编语言统计学生各分数段人数

;以下和你要求的差不多,改改就可以用,有什么不懂得可以问我
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

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

; 程序操作说明:
; 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 ;编译到此结束

J. 用汇编语言学生成绩管理

参照一下这个程序吧,我也不会 这是一个学生成绩管理系统,其中“I”表示插入,“L”表示浏览,“Q”表示查询, “E”表示退出,“D”表示删除,“M”表示修改,"c"表示统计各分数段人数,"p"表示打印. 本程序实现了: (1)单独运行以上各功能,即在进入主菜单以后,点一功能键后关闭,再进入主菜单 点别的功能键。如运行"cjgl"文件后,在出现的主界面中点“I”,可插入数据,插入完 以后,关闭;在出现的主界面中点“M”,可修改数据,修改完以后关闭,用同样的方法 可运行其它的功能。 (2)连续运行部分的功能。 应将文件"score.txt"放在相应的路径下.如在本程序中,需将该文件放在"c:\masm\score.txt"下. 注:该文件的路径可从汇编源文件的"fname db "c:\masm\score.txt"""中查找. data segment mess1 db ' student grade management system',0ah,0dh,'$' mess2 db ' this is main menu',0ah,0dh,'$' mess3 db ' insert (i) please input:',0ah,0dh,'$' mess4 db ' modify (m) name :',0ah,0dh,'$' mess5 db ' delete (d) maths :',0ah,0dh,'$' mess6 db ' query (q) english :',0ah,0dh,'$' mess7 db ' count (c) computer:',0ah,0dh,'$' mess8 db ' print (p) chinese :',0ah,0dh,'$' mess9 db ' exit (e)',0ah,0dh,'$' mess10 db '**********************************************************$' mess11 db 'name Ma En Co Ch',0ah,0dh,'$' mess13 db ' list (l)',0ah,0dh,'$' mess12 db 'maths <60 <70 <80 <90 <100',0ah,0dh,'$' err1 db ' there is not this student$' err2 db ' file close wrong$' fname db "e:\hbyy\score.txt" buffer1 db 23 p(?) buffeer db 0ah,0dh,'$' buffer2 db 30 p(?) buffer3 db 8 p('0') count db 5 handle dw ? del db 8 p('0') x db ? data ends score struc names db 15 p(' ') maths db 0,0 english db 0,0 computer db 0,0 chinese db 0,0 score ends show macro addrs lea dx,addrs mov ah,9 int 21h endm set_p1 macro a mov ah,2 mov dh,a mov dl,36 mov bh,0 int 10h endm set_p2 macro mov ah,2 mov dh,12 mov dl,2 mov bh,0 int 10h endm set_p3 macro mov ah,2 mov dh,1 mov dl,30 mov bh,0 int 10h endm clear macro ;all screen mov al,0 mov cl,0 mov ch,0 mov dh,24 mov dl,79 mov bh,7 mov ah,6 int 21h endm clear1 macro ;lefe screen mov al,0 mov bh,7 mov ch,4 mov cl,36 mov dh,10 mov dl,79 mov ah,6 int 10h endm clear2 macro ;down screen mov al,0 mov bh,7 mov ch,12 mov cl,0 mov dh,24 mov dl,79 int 10h endm newline macro push ax push dx mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h pop dx pop ax endm show_item macro addrs local iloop,w10 push bx push cx mov bx,0 iloop: mov dl,addrs[bx] ;display char mov ah,2 int 21h inc bx cmp bx,15 jl iloop mov cx,4 w10: mov dl,' ' mov ah,2 int 21h mov dl,' ' mov ah,2 int 21h mov dl,' ' mov ah,2 int 21h mov dl,addrs[bx] mov ah,2 int 21h inc bx mov dl,addrs[bx] mov ah,2 int 21h inc bx loop w10 newline pop cx pop bx endm getin macro addrs,count2 local zeroit,lp,input_end,exit push bx push ax mov bx,0 zeroit: mov addrs[bx],' ' inc bx cmp bx,15 jl zeroit mov bx,0 lp: mov ah,1 int 21h cmp al,0ah jz input_end cmp al,0dh jz input_end mov addrs[bx],al inc bx cmp bx,count2 jl lp input_end: cmp al,0dh jz exit cmp al,0ah jz exit mov ah,7 int 21h jmp input_end exit: pop ax pop bx endm code segment main proc far assume cs:code,ds:data,es:data start: mov ax,data mov ds,ax mov ah,0 mov al,3 int 10h clear show mess1 show mess2 show mess13 show mess3 show mess4 show mess5 show mess6 show mess7 show mess8 show mess9 newline show mess10 set_p3 w: mov ah,7 int 21h cmp al,'i' jnz n1 call insert jmp w n1: cmp al,'m' jnz n2 call modify jmp w n2: cmp al,'d' jnz n3 call delete jmp w n3: cmp al,'q' jnz n4 call query jmp w n4: cmp al,'c' jnz n5 call cot jmp w n5: cmp al,'p' jnz n6 call print jmp w n6: cmp al,'l' jnz n7 call list jmp w n7: cmp al,'e' jz exitf jmp w exitf: mov ah,4ch int 21h ret main endp insert proc near push ax push bx push cx push dx mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax clear1 set_p1 4 call get_rec mov cx,0 ;move file pointer to end mov dx,0 mov al,2 mov ah,42h int 21h mov cx,23 ;write file mov dx,offset buffer1 mov ah,40h int 21h mov ah,3eh int 21h set_p3 pop dx pop cx pop bx pop ax ret insert endp get_rec proc near push ax push bx getin buffer2,15 mov bx,0 mov cx,15 continue: mov al,buffer2[bx] mov buffer1[bx],al inc bx loop continue set_p1 5 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx set_p1 6 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx set_p1 7 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx set_p1 8 getin buffer2,2 mov al,buffer2 mov buffer1[bx],al inc bx mov al,buffer2+1 mov buffer1[bx],al inc bx pop bx pop ax ret get_rec endp openf proc near mov dx,offset fname mov al,02 mov ah,3dh int 21h mov handle,ax ret openf endp query proc near push ax push bx push cx push dx clear1 clear2 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax set_p2 getin buffer1,15 lea dx,mess11 mov ah,9 int 21h b: mov ah,3fh mov cx,23 mov dx,offset buffer2 int 21h lea si,buffer2 lea di,buffer1 mov cx,15 c: mov al,byte ptr[si] cmp al,byte ptr[di] jnz b inc si inc di loop c mov [buffer2+23],'$' show_item buffer2 mov ah,3eh int 21h pop dx pop cx pop bx pop ax ret query endp modify proc near push ax push bx push cx push dx clear1 set_p1 4 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax mov handle,ax call get_rec ; contact is in buffer1 read: mov dx,offset buffer2 mov cx,23 mov ah,3fh int 21h lea si,buffer2 lea di,buffer1 mov cx,15 c5: mov dl,byte ptr[si] cmp dl,byte ptr[di] jnz read inc si inc di loop c5 mov bx,handle mov ah,42h mov al,1 mov cx,0ffffh mov dx,-23 int 21h mov cx,23 mov dx,offset buffer1 mov ah,40h int 21h mov ah,3eh int 21h jmp exit2 exit1: set_p2 show err1 exit2: set_p3 pop dx pop cx pop bx pop ax ret modify endp delete proc near push ax push bx push cx push dx clear1 set_p1 4 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax mov handle,ax getin buffer1,15 ; contact is in buffer1 read5: mov dx,offset buffer2 mov cx,23 mov ah,3fh int 21h lea si,buffer2 lea di,buffer1 mov cx,15 c6: mov dl,byte ptr[si] cmp dl,byte ptr[di] jnz read5 inc si inc di loop c6 mov bx,handle mov ah,42h mov al,1 mov cx,0ffffh mov dx,-8 int 21h mov cx,8 mov dx,offset del mov ah,40h int 21h mov ah,3eh int 21h jmp exit6 exit5: set_p2 show err1 exit6: set_p3 pop dx pop cx pop bx pop ax ret delete endp list proc near push ax push bx push cx push dx clear1 clear2 set_p2 show mess11 mov dx,offset fname mov al,2 mov ah,3dh int 21h mov bx,ax again: mov dx,offset buffer1 mov cx,23 mov ah,3fh int 21h cmp ax,0 jz p show_item buffer1 jmp again p: mov ah,3eh int 21h set_p3 pop dx pop cx pop bx pop ax ret list endp print proc near push ax call openf mov cl,count mov ch,0 read2: mov dx,offset buffer1 mov cx,type score mov ah,3fh int 21h mov cx,23h mov bx,0 next: mov ah,5 mov dl,byte ptr buffer1[bx] int 21h inc bx loop next mov ah,5 mov dl,0dh int 21h dec x cmp x,0 jnz read2 mov bx,handle mov ah,3eh int 21h pop ax ret print endp cot proc push ax clear2 set_p2 show mess12 mov dx,offset fname mov ah,3dh int 21h mov bx,ax mov handle,ax read0: mov dx,offset buffer2 mov cx,23 mov ah,3fh int 21h mov dl,[buffer2+15] cmp dl,'6' jl five cmp dl,'7' jl six cmp dl,'8' jl seven cmp dl,'9' jl eight inc [buffer3+4] jmp quit eight: inc [buffer3+3] jmp quit seven: inc [buffer3+2] jmp quit six: inc [buffer3+1] jmp quit five: inc [buffer3] quit: cmp ax,0 jnz read0 mov cx,10 a: mov dl,' ' mov ah,2 int 21h loop a mov bx,0 a0: mov dl,[buffer3+bx] mov ah,2 int 21h inc bx mov dl,' ' mov ah,2 int 21h mov dl,' ' mov ah,2 int 21h cmp bx,5 jnz a0 mov bx,handle mov ah,3eh int 21h set_p3 pop ax ret cot endp 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