汇编键盘输入10个学生的成绩,试编制一个程序统计60~69分,70~79分,80-89分,90~99分及100分的人数,分别存放到S6、S7、S8、S9及S10单元中。
时间: 2023-09-05 17:04:45 浏览: 426
编程序实现设有10个学生的成绩分别为85、62、64、79、82、99、100、78、88、86,试编制一个子程序统计60~69分,70~79分 ,80~89分,90~99分及100分的人数,分别存放到S6,S7,S8,S9及S10单元中。
4星 · 用户满意度95%
### 回答1:
以下是一份基于8086汇编语言的程序,可以实现输入10个学生的成绩,并统计各个成绩段的人数:
```
org 100h
section .data
msg db '请输入第%d个学生的成绩:$'
s60 db '60~69分的人数:%d$'
s70 db '70~79分的人数:%d$'
s80 db '80~89分的人数:%d$'
s90 db '90~99分的人数:%d$'
s100 db '100分的人数:%d$'
count60 dw 0
count70 dw 0
count80 dw 0
count90 dw 0
count100 dw 0
section .text
mov cx, 10 ; 循环10次,输入10个学生的成绩
mov bx, 0 ; 初始化bx为0,用于存放输入的成绩
mov di, 1 ; 初始化di为1,用于输出提示信息中的学生序号
input_loop:
; 输出提示信息
mov ah, 9
mov dx, msg
mov si, di
push si
call printf
add sp, 2
; 读取键盘输入
mov ah, 1
int 21h
sub al, '0'
mov bh, al
; 判断输入是否合法
cmp bh, 0
jle input_loop
cmp bh, 100
jge input_loop
; 统计人数
cmp bh, 60
jb input_loop
cmp bh, 70
jb count60to69
cmp bh, 80
jb count70to79
cmp bh, 90
jb count80to89
cmp bh, 100
jb count90to99
inc word [count100]
jmp input_loop
count60to69:
inc word [count60]
jmp input_loop
count70to79:
inc word [count70]
jmp input_loop
count80to89:
inc word [count80]
jmp input_loop
count90to99:
inc word [count90]
jmp input_loop
; 输出统计结果
mov ah, 9
mov dx, s60
mov si, [count60]
push si
call printf
add sp, 2
mov ah, 9
mov dx, s70
mov si, [count70]
push si
call printf
add sp, 2
mov ah, 9
mov dx, s80
mov si, [count80]
push si
call printf
add sp, 2
mov ah, 9
mov dx, s90
mov si, [count90]
push si
call printf
add sp, 2
mov ah, 9
mov dx, s100
mov si, [count100]
push si
call printf
add sp, 2
; 程序结束
mov ah, 4ch
int 21h
```
程序中使用了一些汇编语言中的基本语法,如mov、cmp、jxx等,需要一些汇编语言的基本知识才能理解。程序的核心逻辑是在循环输入学生成绩的过程中,判断每个成绩属于哪个成绩段,然后累加对应成绩段的人数。最后,输出各个成绩段的人数。
### 回答2:
汇编语言程序的大致思路如下:
1. 定义变量,包括学生人数、各个成绩段的人数。
2. 准备一个循环来输入学生的成绩并进行判断。
3. 使用条件判断来判断学生的成绩属于哪个分数段,并将相应的人数加一。
4. 将各个分数段的人数存放到指定的内存单元中。
具体的汇编语言程序如下:
```
ORG 100H ; 程序起始地址
MOV CX, 10 ; 输入学生人数
MOV BX, 0 ; 初始化各个分数段人数为0
MOV S6, 0
MOV S7, 0
MOV S8, 0
MOV S9, 0
MOV S10, 0
LOOP:
MOV AH, 1 ; 监听键盘输入
INT 21H ; 获取键盘输入的字符
CMP AL, 0DH ; 判断是否回车键
JE CALCULATE ; 如果是回车键,跳转到CALCULATE标签
SUB AL, 30H ; 字符转换成数字
MOV DL, AL
CMP DL, 60 ; 判断成绩在哪个分数段
JB SCORE_LESS_60 ; 如果小于60分,跳转到SCORE_LESS_60标签
CMP DL, 70 ; 每个判断的条件下部分代码相同
JB SCORE_60_69 ; 大于等于60分,小于70分,跳转到SCORE_60_69标签
CMP DL, 80
JB SCORE_70_79
CMP DL, 90
JB SCORE_80_89
CMP DL, 100
JBE SCORE_90_100
SCORE_LESS_60:
INC S6 ; 60分以下
JMP LOOP_END ; 跳转到LOOP_END标签
SCORE_60_69:
INC S7 ; 60-69分
JMP LOOP_END
SCORE_70_79:
INC S8 ; 70-79分
JMP LOOP_END
SCORE_80_89:
INC S9 ; 80-89分
JMP LOOP_END
SCORE_90_100:
INC S10 ; 90-100分
JMP LOOP_END
CALCULATE:
MOV SI, 6 ; SI存放S6的内存地址
MOV CX, 5 ; 循环5次,共有5个分数段
MOV AX, 0
MOV BX, 0
CALCULATE_LOOP:
ADD AX, [SI] ; 将当前分数段的人数累加到AX
ADD BX, AX ; 累加结果保存到BX,BX最后保存所有分数段的人数总和
ADD SI, 2 ; SI移动到下一个分数段的内存地址
LOOP CALCULATE_LOOP ; 循环5次
MOV [SI], BX ; 将所有分数段的人数总和存储到S10的内存单元
LOOP_END:
LOOP LOOP ; 循环10次,输入10个学生的成绩
MOV AH, 4CH ; 结束程序
INT 21H
S6 DW 0 ; 定义S6的内存单元
S7 DW 0 ; 定义S7的内存单元
S8 DW 0 ; 定义S8的内存单元
S9 DW 0 ; 定义S9的内存单元
S10 DW 0 ; 定义S10的内存单元
END ; 程序结束
```
以上汇编程序会通过循环输入10个学生的成绩,并统计各个分数段的人数,并将结果存放在S6、S7、S8、S9和S10的内存单元中。
### 回答3:
以下是一个汇编语言程序的示例,可以实现所描述的功能:
```
.MODEL SMALL
.STACK 100H
.DATA
S6 DB ?
S7 DB ?
S8 DB ?
S9 DB ?
S10 DB ?
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, 10 ; 输入学生人数
MOV BX, 0 ; 计数器清零
INPUT_LOOP:
MOV AH, 1
INT 21H ; 读取一个字符
CMP AL, 0D ; 判断是否输入结束
JE PROCESS_SCORES
MOV BL, AL
SUB BL, 30H ; ASCII码转换为数字
CMP BL, 6
JA INPUT_LOOP ; 若输入不是数字,则重新输入
MOV AH, 1
INT 21H ; 读取一个字符(回车)
MOV AH, 2
MOV DL, 0AH
INT 21H ; 换行
CMP BL, 6
JBE SKIP_INCREMENT
CMP BL, 7
JBE INC_S7
CMP BL, 8
JBE INC_S8
CMP BL, 9
JBE INC_S9
INC S10 ; 成绩为100,S10加1
JMP INPUT_LOOP
INC_S9:
INC S9 ; 成绩为90~99,S9加1
JMP INPUT_LOOP
INC_S8:
INC S8 ; 成绩为80~89,S8加1
JMP INPUT_LOOP
INC_S7:
INC S7 ; 成绩为70~79,S7加1
JMP INPUT_LOOP
SKIP_INCREMENT:
JMP INPUT_LOOP
PROCESS_SCORES:
MOV DL, S7
ADD DL, S8
ADD DL, S9
ADD DL, S10
MOV S6, DL ; 合并S7~S10的值,存入S6
; 输出各个人数的结果
MOV AH, 2
MOV DL, '6'
ADD DL, 30H ; 数字转换为ASCII码
INT 21H
MOV DL, ','
INT 21H
MOV DL, ' '
INT 21H
MOV DL, S6
ADD DL, 30H ; 数字转换为ASCII码
INT 21H
MOV AH, 2
MOV DL, '7'
ADD DL, 30H
INT 21H
MOV DL, ','
INT 21H
MOV DL, ' '
INT 21H
MOV DL, S7
ADD DL, 30H
INT 21H
; 输出其他人数的结果...
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
```
这个程序首先会要求用户输入10个学生的成绩(0-9),并根据成绩范围来增加相应的计数器(S6-S10)。在输入过程中,程序会检查输入是否为合法数字(0-9)。当输入结束后,程序会输出各个成绩段的学生人数。
阅读全文