初学汇编,问一道题

lin1326zhang 2007-06-13 05:21:42
设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。
编程提示:
1、成绩分等部分采用分支结构,统计所有成绩则用循环结构完成,显示统计结果采用DOS功能调用。
2、统计学生成绩和显示统计结果两部分内容用子程序结构来完成。

extrn cdispbx:far,ccount:far
data1 segment
msg db 76,69,84,90,73,88,99,63,100,80
data1 ends
code1 segment
assume cs:code1,ds:data1
start: mov ax,data1
mov ds,ax
mov dx,offset msg
mov cx,data1
jcxz exit
call ccount
call cdispbx
mov bh,bl
call cdispbx
mov bh,ch
call cdispbx
mov bh,cl
call cdispbx
mov bh,dh
call cdispbx
mov bh,dl
call cdispbx
exit:mov ah,4ch
int 21h
code1 ends
end start









public ccount
seg1 segment 'code'
ccount proc far
assume cs:seg1
push ax
push si
mov si,dx
xor bh,bh
xor bl,bl
xor ch,ch
xor cl,cl
xor dh,dh
xor dl,dl
mov si,dx
mov cx,10
jcxz exit
again:mov al,[si]
inc si
cmp al,60
jae next1
inc bh
loop again
next1:cmp al,70
jae next2
inc bl
loop again
next2:cmp al,80
jae next3
inc ch
loop again
next3:cmp al,90
jae next4
inc cl
loop again
next4:cmp al,100
je next5
inc dh
loop again
next5:inc dl
loop again
exit: pop si
pop ax
ret
ccount endp
seg1 ends
end





public cdispbx
data1 segment
db 5 dup('0'),0ah,0dh,'$'
data1 ends
seg3 segment 'code'
cdispbx proc far
assume cs:seg3,ds:data1
push ds
push dx
push cx
push ax
push si
mov ax,data1
mov ds,ax
mov si,4
mov al,bh
cbw
mov cx,10d
again:xor dx,dx
idiv cx
add dl,'0'
mov [si],dl
dec si
jge again
xor dx,dx
mov ah,9
int 21h
pop si
pop ax
pop cx
pop dx
pop ds
ret
cdispbx endp
seg3 ends
end

请各位高手们帮小弟看一下这个程序哪里错了。
 运行后的结果如下
 
 F:\masm>cmain
00127
00086
00000
00000
65459
65451

  谢谢!!!


   
   
...全文
596 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
eduyu 2007-06-17
  • 打赏
  • 举报
回复
真是汗,C++我看看还成,这么长的汇编看着就太费劲了。
From_China 2007-06-14
  • 打赏
  • 举报
回复
汗!这个程序不是一般的大!
mengshijie_1981 2007-06-13
  • 打赏
  • 举报
回复
请楼主分析,参考上面的程序。
mengshijie_1981 2007-06-13
  • 打赏
  • 举报
回复
下面的程序是我以前回答百度里帖子时编写的,并且编译运行通过,结果也正确,麻烦老兄自己动动手,把这个程序修改成子过程就行了。
DATA SEGMENT
NUMBER DB 56,69,84,82,73,88,99,63,100,80
S5 DB 30H ;0-59
S6 DB 30H ;60-69
S7 DB 30H ;70-79
S8 DB 30H ;80-89
S9 DB 30H ;90-99
S10 DB 30H ;100
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
AND BX,0000H
AND AL,00H
MOV BX,OFFSET NUMBER

mov cx,S5-NUMBER ;总人数

AGAIN:MOV AL,[BX]
CMP AL,100
JS NEXT_90 ;如果AL等于100(0110 0100),没有产生借位
INC S10
JMP STO

NEXT_90:CMP AL,90
JS NEXT_80
INC S9
JMP STO

NEXT_80:CMP AL,80
JS NEXT_70
INC S8
JMP STO

NEXT_70:CMP AL,70
JS NEXT_60
INC S7
JMP STO

NEXT_60:CMP AL,60
JS NEXT_50
INC S6
JMP STO

NEXT_50:INC S5

STO: INC BX
LOOP AGAIN

MOV CX,6H
MOV BX,OFFSET S5

DISP:
MOV DL,[BX]
INC BX
MOV AH,02
INT 21H

MOV DL,0 ;在各级人数之间显示空格
MOV AH,02
INT 21H

LOOP DISP

MOV AH,4CH
INT 21H

CODE ENDS
END START

运行结果:

1 2 1 4 1 1

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧