汇编语言程序求答案

最近老师布置一道题,用汇编语言编程统计30个学生成绩,要求:1.键盘输入;2.计算出最高分,最低分并显示;3.统计60分一下,60-69,70-79,80-89,90-100各个分数段人数,并显示;4.计算平均分,显示两位小数;5.结果用菜单显示。本人实在是水平差劲,请求各位高手帮忙写个源程序,感激不尽!

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(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
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 dup(?)
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 dup(?)
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
; -------------------------------------
Students equ 30 ;学生人数
Temp_Cursor dw ? ;输入分数时,当前分数光标位置
Score_Tab db 6 dup(0) ; 各分数段计数
prompt_Str db 'Please input the scores: $'
prompt_Max db CR,LF,CR,LF,'Maximum: $' ;提示显示最高分
prompt_Min db CR,LF,'Minimum: $' ;提示显示最低分
prompt_Res db '00---59: $'
prompt_Ave db CR,LF,'Average: $' ;提示显示平均分
Press_Key db CR,LF,CR,LF,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
; -------------------------------------
; 1、输入成绩
Output prompt_Str ;提示输入成绩
mov @@Digits,3 ;十进制数字位数
mov @@Type_Data,'B' ;保存的数据类型。B=字节类型,W=字类型
lea di,List_Score ;成绩存放地址
mov cx,Students
Input_Score:call GetCursor ;取光标位置
mov dx,word ptr Cursor_Row
mov Temp_Cursor,dx ;保存当前光标位置
call Input_Digit ;输入成绩
cmp cx,1
je @@Next_0
mov dx,Temp_Cursor
add dh,3
mov Cursor_Row,dl
mov Cursor_Col,dh
call SetCursor ;置光标位置
mov dl,','
call Output_Chr ;显示一个字符
@@Next_0: loop Input_Score
; -------------------------------------
; 2、求最高分、最低分并显示
cld
lea si,List_Score ;学生成绩存储区地址
lodsb ;将第一个元素读入AL
mov ah,al ;AH=最高分,AL=最低分
mov cx,Students-1
Compare: cmp al,[si] ;当前最低分与当前元素比较
jbe $+4 ;若小于或等于,不更新最低分,转去与最高分比较
mov al,[si] ;当前最低分大于当前元素,装入新的最低分
cmp ah,[si] ;当前最高分与当前元素比较
jae $+4 ;若大于或等于,不更新最高分
mov ah,[si] ;当前最高分小于当前元素,装入新的最高分
inc si ;增1,准备处理下一个分数
loop Compare
xchg ah,al
push ax
Output prompt_Max ;提示显示最高分
pop ax
push ax
xor ah,ah
call Dec_ASCII ;显示最高分
Output prompt_Min ;提示显示最低分
pop ax
xchg ah,al
xor ah,ah
call Dec_ASCII ;显示最低分
; -------------------------------------
; 3、统计低于60分、60-69、70-79、80-89、90-100各个分数段人数并显示
call Output_CTLF ;输出一个回车、换行
call Output_CTLF ;输出一个回车、换行
lea si,List_Score
xor bx,bx ;总分初值
mov dl,10 ; 用于除10
mov cx,Students
@@Statics: lodsb ; 提取成绩
xor ah,ah
add bx,ax ;累计总分
div dl ; 除10
cmp al,5 ; >5,及格
ja $+4
mov al,5 ; <=5,不及格
sub al,5 ; 减5,分数段计数地址偏移量
cbw ;
push ax
pop di
inc Score_Tab[di] ; 计数
loop @@Statics ; 循环,统计下一个成绩
mov al,Score_Tab[5] ;取100分人数
add Score_Tab[4],al ;加到90-100分数段
push bx ;入栈保存总分
mov bl,59h
mov cx,5
lea si,Score_Tab ;各分数段计数数组首地址
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
; -------------------------------------
; 4、计算并显示平均分
Output prompt_Ave ;提示显示平均分
mov bl,Students
pop ax ;总分出栈
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码
; -------------------------------------
Output Press_Key
mov ah,1
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
List_Score: ;学生成绩存储区
Code ENDS
END Start ;编译到此结束
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-10-27
我给你个办法,用C写完了编译成汇编语言,改一下标号错误就可以了。
第2个回答  2009-10-27
如果是其他语言都好说~用汇编写你得给我200分~
第3个回答  2009-10-27
不难,只是费时间,而且分数太低了。

《汇编语言程序设计》复习题答案求救,分析题!高分,谢谢!
41答案如下:SI是源地址寄存器,DI是目的地址寄存器,就是以源地址寄存器[SI]开始的64H个字节里面的内容,复制到以[DI]为始址的空间中去。CX是计数器嘛,就是复制64H个字节的内容,MOVSB就是MOV 以 B为单位!42答案如下:DATA SEGMENT A DW 0 B DW 0 C DW 15H,5H,50H DATA ENDS CODE SE...

汇编语言程序设计_汇编语言程序设计第五版答案钱晓捷
汇编语言:()是面向机器的程序设计语言。汇编:把汇编语言翻译成机器语言的过程称为汇编。汇编程序:把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,...

求答案:试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母...
NAME TURN DSEG SEGMENT A DB 'PLEASE INPUT (a~z):','$'B DB 0AH,0DH,'$'DSEG ENDS SSEG SEGMENT STACK DB 90H DUP(?)SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV DX,OFFSET A\/\/\/提示输入 MOV AH,09H INT 21H MOV AH,01H I...

·一道简单的汇编语言问题求详细解答
QQ:shr cx,1 ;是将cx逻辑右移1位,CX=0000 0000 0000 1000B,CF=0 RCR AX,1 ;带进位循环右移,AX=0000 0000 0000 0000 0000B,CF=0 ADD BX,1 ;bx=bx+1,BX=01H LOOP qq ;CX-1,即CX=0000 0000 0000 0111B,不等于0,转到QQ继续循环。为了看到每次循环的结果,将各次循环情况分别写在...

高分求汇编语言题答案。
1. 在当前光标位置显示从MESS开始的字符串信息.lea dx,mess mov ah,9 int 21h 2. 定义从ARRY开始的100个变量,初值均为189H.ARRY dw 100 dup(189h)3. 将Bx的内容逻辑右移7位.mov cl,7 shr bx,cl 4. 将CF标志1.stc 5. 从键盘输入一健存AL.mov ah,1 int 21h 1.写出程序,其中X、Y...

汇编语言程序设计题目,在线等答案!!!急!
21H POP AX CMP AH, 10 JB A302 ADD AH, 7 A302:ADD AH, 30H MOV DL, AH MOV AH, 2 INT 21H MOV DL, 'H'MOV AH, 2 INT 21H MOV AH, 4CH INT 21H CODE ENDS END START 程序运行后,将以16进制形式显示平均值58H。

汇编语言问题,题目如下,我知道答案,但不懂,求详细解释
数据段:10E4:0000~10E4:FFFF;附加段:10F4:0000~10F4:FFFF;堆栈段:21F0:0000~21F0:FFFF;代码段:31FF:0000~31FF:FFFF。以上,是按照 10000H 字节计算的。实际上,有些段是重叠的,重叠部分,可以用物理地址计算出来。OF = 0 DF = 0 ZF = 0 CF = 0 ...

2道汇编语言,问答案,及为什么
AL,0和指令MOV AL,0执行后的结果完全一样。(正确)4、字符串操作指令可以使用重复前缀来实现块操作。(正确)5、NOP指令不使CPU执行任何操作,因此执行它不需要任何时间。(正确)三、阅读下面的程序,在空白处填上适当的指令实现程序功能。1、两个非组合BCD数(BY0,BY1)进行十进制减法,并将差求...

汇编语言复习题求答案
编译程序 BP 0 64K BX、BP、SI、DI CL MACRO、ENDM 逢二进一 SS STD 简答题 1-2) SUB AX,BX 3-5) ADD DL,[BX][SI]6) MOV CL,5 SHL AX,CL 7-8) SBB AX,0520H 9-10)MOV AX,SEG TABLE 11) AND DI,0FFFFH 12) OUT 61H,AL 13) XHG SI,DI 设相关...

汇编语言程序设计题目,在线等答案!!!急!
MOV AL, A ;取来A AND AL, 00001111B MOV CL, 4 SHR AL, CL ;左移4位.MOV CL, AL MOV AL, B ;取来B AND AL, 00001111B ADD AL, CL ;合成.MOV C, AL ;保存.END ;--- 15.比较两个变量A和B的大小,在屏幕上显示比...

相似回答