汇编语言 实现求平均数问题 急急急急急!!!!!!!!!

从键盘上输入7名裁判的评分(输入范围是0~9);
将7个评分由高到低进行排序,并在显示器上显示出来;
扣除一个最高分,一个最低分,计算出其他8项评分的平均值(保留一位小数)在显示器上输出,即要显示出有整数部分、小数部分以及小数点;
在屏幕上的每次输入或输出都有清晰的英文提示,说明显示数据的含义,人机对话界面清晰整洁;当裁判输入的评分不在0~9范围内,能够提示输入错误,要求重新输入评分。

; 题目名称:评委打分,去掉一个最高分、一个最低分,求平均得分,保留1位小数
; 题目来源:http://zhidao.baidu.com/question/130197847.html
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
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
; -------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH CS
POP DS
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
POP DS
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH CS
POP DS
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
POP DS
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。
; 输足N位的,自动结束输入;不足N位的,空格结束输入。
; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536
; 约定:直接回车,视为数字0
; 入口:cs:@@Digits=数字位数;es:di=保存输入的数字首地址
; cs:@@Type_Data=保存的数据类型,B=字节类型,W=字类型。
; 出口:转换后的二进制数保存在di所指的单元
Input_Dec Proc Near
push ds
push dx
push cx
push bx
push di
push cs
pop ds
call GetCursor ;取光标位置
mov dx,WORD PTR Cursor_Row
mov @@Tmp_Cursor,dx ;保存起始光标位置
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input_Dec: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,20h ;若键入的是空格,已经键入的数字不足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: cmp cl,cs:@@Digits ;十进制数字位数
jz @@Input_Dec
inc cx
dec di
dec Cursor_Col
@@KBBack: call SetCursor ;置光标位置
jmp @@Input_Dec
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input_Dec ;接受下一个数字
@@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
xor ah,ah
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit: lodsb
xor ah,ah
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;字节类型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
pop ds
ret
@@Tmp_Cursor dw ? ;起始光标位置
@@Digits db ? ;十进制数字位数
@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型
@@Save_Tmp db 16 dup(?)
Input_Dec EndP
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[5]
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
ret
@@Temp_Save db 6 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
; -------------------------------------
Teachers equ 7 ;评委人数
Temp_Cursor dw ? ;评委打分时,当前分数光标位置
Grades db Teachers dup(?) ;Teachers位评委给出的分数
Prompt_Str1 db 'Please input ',Teachers or 30h,' grades(0-9): $'
Prompt_Str2 db CR,LF,CR,LF,'The decreased grades: $' ;由高到低排序后的评分,提示信息
Last_Grade db CR,LF,CR,LF,'The last everage grade: $' ;平均得分
Press_Key db CR,LF,CR,LF,'Press any key to exit...$'
; -------------------------------------
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
; -------------------------------------
; 1. 从键盘上输入7名裁判的评分(输入范围是0~9);
Output Prompt_Str1 ;提示评委亮分
lea di,Grades ;分数存放地址
mov @@Digits,1 ;数字位数
mov @@Type_Data,'B' ;保存的数据类型,B=字节类型,W=字类型
mov cx,Teachers ;评委人数
Input_Grades: call GetCursor ;取光标位置
mov dx,WORD ptr Cursor_Row
mov Temp_Cursor,dx ;保存当前光标位置
call Input_Dec ;从键盘输入一位评委的打分
cmp cx,1
je @@Next_0
mov dx,Temp_Cursor
add dh,2
mov Cursor_Row,dl
mov Cursor_Col,dh
call SetCursor ;置光标位置
mov dl,20h ;空一格
call Output_Chr ;显示一个字符
@@Next_0: loop Input_Grades ;下一个评委的打分
; -------------------------------------
; 2. 将7个评分由高到低进行排序,并在显示器上显示出来;
cld
lea si,Grades ;评分存储区地址
mov cx,Teachers-1 ;外循环次数
@@Scanning: push cx ;入栈保存外循环次数
push si ;入栈保存数组地址
@@Compare: push si
pop di ;当前数组元素地址赋给目的变址寄存器,以备交换之用
lodsb ;将当前数组元素读入累加器
cmp al,[si] ;当前数组元素与相邻的下一个数组元素相比较
jae @@NextOne ;若大于或等于,不作数据交换,处理下一个数组元素
xchg al,[si] ;若小于,交换数组元素,递减排序
stosb ;保存数值较小者
@@NextOne: loop @@Compare ;处理下一个数组元素
pop si ;数组地址出栈
pop cx ;外循环次数出栈
loop @@Scanning ;下一趟比较
Output Prompt_Str2 ;由高到低排序后的评分
lea si,Grades ;评分存储区地址
mov cx,Teachers ;评委人数
@@List_Grades: lodsb ; 提取成绩
xor ah,ah
call Dec_ASCII ;显示成绩
cmp cx,1
je @@Next_1
mov dl,20h
call Output_Chr ;显示一个字符
@@Next_1: loop @@List_Grades
; -------------------------------------
; 3. 扣除一个最高分,一个最低分,计算出其他5项评分的平均值(保留一位小数)在显示器上输出
lea si,Grades[1] ;去掉一个最高分之后的评分地址
mov cx,Teachers-2 ;评委人数-2
xor ah,ah ;总分初值
Addition: lodsb
add ah,al ;累加各评委分数
loop Addition
push ax
Output Last_Grade ;提示显示平均分
pop ax
xchg ah,al
xor ah,ah
mov bl,Teachers-2
div bl ;平均分取整数部分
mov bh,ah ;保存余数
xor ah,ah
call Dec_ASCII
mov ah,bh ;余数
mov bh,bl ;除数
mov cx,1 ;保留小数位数
call Dec_Frac ;把AL中的二进制无符号数作为小数转换成显式的十进制ASCII码
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-12-21
这个问题我回答过,原来的地址是
http://zhidao.baidu.com/question/129360626.html
后来莫名其妙的消失了,那就算我没回答过
用这个答案再回答一次。这个题我也已经发在我的空间了。
http://hi.baidu.com/烛秋/blog/item/e390b60790b21c70020881a9.html
DATA SEGMENT
BUF DB 8 DUP(0)
STRING1 DB 'SCORE FROM JUDGE '
NUMBER DB 31H,': ','$'
STRING2 DB 'THE RANGE OF SCORE:','$'
STRING3 DB 'THE AVERAGE IS:','$'
ERROR DB 'ERROR',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
XOR SI,SI
MOV CX,7
INPUT_1:
LEA DX,STRING1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,'0'
JB ER
CMP AL,'9'
JA ER
MOV BUF[SI],AL
INC SI
INC NUMBER
MOV DL,0AH
INC AH
INT 21H
MOV DL,0DH
INT 21H
LOOP INPUT_1
;循环输入7次
JMP RANGE_0
;输入错误提示,跳到输入提示
ER: LEA DX,ERROR
MOV AH,9
INT 21H
JMP INPUT_1
RANGE_0:
MOV BX,1
MOV CX,7
XOR DI,DI
RANGE: MOV AL,BUF[DI]
CMP AL,BUF[DI+1]
JAE NEXT
XCHG BUF[DI+1],AL
MOV BUF[DI],AL
MOV BX,0
NEXT: INC DI
LOOP RANGE
CMP BX,0
JE RANGE_0
;RANGE部分采用的是改进型的冒泡法,当相邻两个数不再交换时,表示已经排好序了。
LEA DX,STRING2
MOV AH,9
INT 21H
MOV CX,7
XOR SI,SI
MOV AH,2
RANGE_OUTPUT:
MOV DL,BUF[SI]
INT 21H
INC SI
MOV DL,0
INT 21H
LOOP RANGE_OUTPUT
; 输出排序后的值
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
LEA DX,STRING3
MOV AH,9
INT 21H
MOV CX,4
XOR AX,AX
MOV AL,BUF[SI-2]
XOR AL,30H
SUM_DIV:
ADD AL,BUF[SI-3]
SUB AL,30H
DEC SI
LOOP SUM_DIV
MOV BL,5
DIV BL
PUSH AX
XOR AL,30H
MOV DL,AL
MOV AH,2
INT 21H
MOV DL,'.'
MOV AH,2
INT 21H
POP AX
MOV AL,AH
SHL AL,1
MOV DL,AL
XOR DL,30H
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START本回答被提问者采纳

汇编语言 实现求平均数问题 急急急急急!!!
汇编语言 实现求平均数问题 急急急急急!!!; 题目名称:评委打分,去掉一个最高分、一个最低分,求平均得分,保留1位小数; 题目来源:http:\/\/zhidao.baidu.com\/question\/130197847.html; 本程序在MAS

跪求汇编调用C语言求平均数
avr1=a\/3.0;avr2=b\/3.0;avr3=c\/3.0;printf("\\nC++ 高数 英语3科成绩的总平均分分别是:%.2f %.2f %.2f\\n\\n",avr1,avr2,avr3);max=stu[1].score[0]+stu[1].score[1]+stu[1].score[2];for(i=1;i<=3;i++){q[i]=stu[i].score[0]+stu[i].score[1]+stu[...

跪求汇编语言程序求10个数的平均数
for(i=0;i<10;i++); {输入10个数循环给i;(具体自己写) s=s+i;} a=s\/10; 输出就可以了;

求大神用汇编语言帮忙写一个求平均数的代码 要能键入n个数 然后求n个...
9 int 21h call readnum mov n, bx mov cx, bxm0: call readnum add sum, bx loop m0 lea dx, msg2 mov ah, 9 int 21h mov ax, sum xor dx, dx div n mov avg, ax call print10 mov ax, 4c00h int 21hprint10: xor cx, cx mov bx, 10p0:...

利用汇编语言编程求平均数
为了你好不给你编,给你思路,先定义一个数组存放全班同学的考试成绩(array db 56,60,80,90...),再定义一个count用于存放数组元素个数(count EQU-arary)然后把指针指向数组首元素,一个个开始相加,结果保存在一个寄存器中,然后使用div指令求平均数(注意div指令的使用注意点)。

用汇编语言编写求三个数的平均数
segment x dw 345 y dw 234 z dw 234 m dw 897 n dw 999;定义五个数 r dw 2 dup (?);存储结果 data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov ax,x add ax,y mov cx,ax mov bx,dx mov ax,y cwd add cx,ax adc bx,0 mov ax,z cwd ...

C语言求平均数问题
void main(){ float a,b,c,ave;printf("Please input 3 numbers:");scanf("%f,%f,%f",&a,&b,&c); \/\/连续输入三个数,用逗号隔开 ave=(a+b+c)\/3;printf("The average is:%f",ave);} C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国...

用汇编语言程序求20个数的平均数
n db 20 dup(?)avr db 0 ..mov bx,offset n mov cx,20 mov dx,0 next:mov al,[bx]add dl,al adc dh,0 inc bx loop next mov ax,dx mov bl,20 div bl mov avr,al ;平均成绩在avr中

单片机汇编语言编程,采集,求和,求平均数
变更)数据的程序段,对于连续数据的存取,尽量用mov @Ri,xx,来操作,运算也用这个命令,C语言对这个已经不重要了,不过汇编还是得遵守一些默认规则。头几年还做过,采集一组10个数据,去掉两个最高分,两个最低分,中间6个值相加求平均值,现在还在用。水平的提高还得靠自己,呵呵。

用汇编语言编写80c51单片机程序,求内部RAM中50H~59H十个单元内容的平均...
MUL AB ;A=溢出部分的平均值,肯定小于0FF MOV 5AH,A ;第一部分的平均值p1给5AH MOV A,#6H MOV B,5BH MUL AB ;值给5BH,最大值是3CH,所以不用考虑溢出。ADD A,5CH ;MOV B,#10 DIV AB ;6B+s1的平均值p2 ADD A,5AH MOV 5AH,A ;p1+p2 MOV 5BH,B SJMP END ...

相似回答