求助:一道简单的汇编语言程序设计

题目如下:
设有九个学生某门课的成绩存放在数据区中。试编制一个程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。
希望有哪位朋友能回答。本人急用:谢谢
楼下的回答我早在百度能找到的了,而且还是不正确的 。汇编语言中没有if和elseif的。那位高手能继续回到我?

8086汇编语言,使用masm5汇编器编译通过

data segment
score db 30,40,50,60,70,80,90,67,70 ;9个学生的分数
num_under60 db 0 ;60以下的人数
num_60to69 db 0 ;60到69的人数
num_70to79 db 0 ;70到79的人数
num_80to89 db 0 ;80到89的人数
num_90to99 db 0 ;90到99的人数
num_100 db 0 ;100的人数
data ends

code segment
assume cs:code,ds:data

start:
mov ax,data
mov ds,ax
xor ax,ax
mov cx,9 ;循环9次
lea bx,score

compare:
cmp byte ptr [bx],60 ;与60比较
jl under60
jmp is60to69
is60to69:
cmp byte ptr [bx],70 ;与70比较
jl _60to69
jmp is70to79
is70to79:
cmp byte ptr [bx],80 ;与80比较
jl _70to79
jmp is80to89
is80to89:
cmp byte ptr [bx],90 ;与90比较
jl _80to89
jmp is90to99
is90to99:
cmp byte ptr [bx],100 ;与100比较
jl _90to99
jz equal100

under60: ;如果低于60
add num_under60,1
jmp con
_60to69: ;如果在60到69之间
add num_60to69,1
jmp con
_70to79: ;如果在70到79之间
add num_70to79,1
jmp con
_80to89: ;如果在80到89之间
add num_80to89,1
jmp con
_90to99: ;如果在90到99之间
add num_90to99,1
jmp con
equal100: ;如果等于100
add num_100,1
con:
lea bx,[bx+1]
loop compare

last: ;输出
mov dl,num_under60 ;输出60以下的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_60to69 ;输出60到69的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_70to79 ;输出70到79的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_80to89 ;输出80到89的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_90to99 ;输出90到99的人数
add dl,30h
mov ah,2
int 21h
mov dl,num_100 ;输出100的人数
add dl,30h
mov ah,2
int 21h
mov ah,4ch ;返回DOS
int 21h
code ends
end start
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-12-31
assume cs:code,ds:data,ss:stack

data segment
db 85,81,72,57,36,92,100,63,95
msg db "<60,60-69,70-79,80-89,90-99,=100 :",0dh,0ah,"$"
space db " $" ;成绩数之间的显示间隔
data ends

stack segment
dw 9 dup (0) ;主要用来保存各个区间的成绩数
stack ends

code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,18
mov al,110
mov cx,6 ;6个区间

;以取值区间为对象来循环,每个成绩至少比较了6次(与区间上下限相比):
compare:
mov bx,8 ;从最后一个成绩开始判断
mov di,0 ;区间成绩数初始为0
push cx ;call前保存外部循环次数
mov cx,9 ;9个成绩
call calc
pop cx ;call后恢复外部循环次数
push di
sub al,10
loop compare

;显示结果:{
mov dx,offset msg
mov ah,9
int 21h

mov cx,6
printNum:
;输出成绩数
pop ax
add ax,30h ;数字转换为字符
mov dl,al
mov ah,2
int 21h
;输出成绩数之间的间隔:
mov dx,offset space
mov ah,9
int 21h
loop printNum
;}

mov ah,0
int 16h
mov ax,4c00h
int 21h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;本子程序确定落在某个成绩区间里的成绩数
calc:
push ax
cmp byte ptr [bx],al
jnb nextArea
cmp al,60
je addNum
sub al,10
cmp byte ptr [bx],al
jb nextArea
addNum:
inc di
nextArea:
pop ax
dec bx
loop calc
ret
code ends

end start
第2个回答  2007-12-31
我考!才100分!花了我一点时间!绝对是正确的!

DATA SEGMENT
HAN DB 42,62,68,70,79,82,85,90,95
MEM DB 6 dup(30h),'$' ;分别用于存放各分数段成绩的个数
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV CX,9
mov si,0
begin:
.if han[si]<60
add mem[0],1
.elseif han[si]>=60 && han[si]<=69
add mem[1],1
.elseif han[si]>=70 && han[si]<=79
add mem[2],1
.elseif han[si]>=80 && han[si]<=89
add mem[3],1
.elseif han[si]>=90 && han[si]<=99
add mem[4],1
.else
add mem[5],1
.endif
inc si
loop begin

mov dx,offset mem ;显示统计结果122220
mov ah,9
int 21h
MOV AX,4C00H
INT 21H
CODE ENDS
END START
第3个回答  2008-01-01
dataseg segment
grade dw 76,69,84,90,73,88,99,63,100
s5 db 0
s6 db 0
s7 db 0
s8 db 0
s9 db 0
s10 db 0
dataseg ends
cseg segment
main proc far
assume cs:cseg,ds:dataseg
start:
push ds
sub ax,ax
push ax
mov ax,dataseg
mov ds,ax
mov cx,9
call count
call disp
mov ah,1
int 21h
ret
main endp
count proc near
mov si,0
next:mov ax,grade[si]
mov bl,10
div bl
mov bl,al
mov bh,0
sub bx,5
cmp bx,0
jae next1
mov bx,0
next1:
inc s5[bx]
add si,2
loop next
ret
count endp
disp proc near
lea si,s5
mov cx,6
loop1:
mov dl,[si]
add dl,30h
mov ah,2
int 21h
inc si
loop loop1
ret
disp endp
cseg ends
end start
第4个回答  2007-12-31
前面不带点的if是8086中宏汇编的条件汇编
前面带点的if是win32汇编中的伪指令
相似回答