设有 10 个学生的成绩分别是 76,69,84,90,53,88,99,63,100 和 80 分。试编制宏统计0~59分, 60~69 分,70~79 分,80~89 分,90~99 分和 100 分的人数,分别存放到 S5,S6,S7,S8,S9和S10单元中。
时间: 2024-04-10 15:20:46 浏览: 87
以下是一个可以实现该功能的宏:
```
ORG 0000H
MOV R0, #0 ; 初始化计数器
MOV R1, #0 ; 初始化指针
; 统计 0~59 分的人数
LOOP1:
CJNE R1, #10, ELSE1 ; 如果指针到达数组末尾,则跳转到 ELSE1
MOV A, @R1 ; 取出当前学生的成绩
CJNE A, #0, ELSE2 ; 如果当前成绩不在 0~59 分范围内,则跳转到 ELSE2
INC R0 ; 计数器加 1
INC R1 ; 指针加 1
SJMP LOOP1 ; 继续循环
ELSE2:
INC R1 ; 指针加 1
SJMP LOOP1 ; 继续循环
ELSE1:
MOV S5, R0 ; 将计数器的值存储到 S5 单元中
; 统计 60~69 分的人数
MOV R0, #0 ; 重新初始化计数器
MOV R1, #0 ; 重新初始化指针
LOOP2:
CJNE R1, #10, ELSE3
MOV A, @R1
CJNE A, #0, ELSE4 ; 如果当前成绩不在 60~69 分范围内,则跳转到 ELSE4
INC R0
INC R1
SJMP LOOP2
ELSE4:
INC R1
SJMP LOOP2
ELSE3:
MOV S6, R0 ; 将计数器的值存储到 S6 单元中
; 统计 70~79 分的人数
MOV R0, #0
MOV R1, #0
LOOP3:
CJNE R1, #10, ELSE5
MOV A, @R1
CJNE A, #0, ELSE6 ; 如果当前成绩不在 70~79 分范围内,则跳转到 ELSE6
INC R0
INC R1
SJMP LOOP3
ELSE6:
INC R1
SJMP LOOP3
ELSE5:
MOV S7, R0 ; 将计数器的值存储到 S7 单元中
; 统计 80~89 分的人数
MOV R0, #0
MOV R1, #0
LOOP4:
CJNE R1, #10, ELSE7
MOV A, @R1
CJNE A, #0, ELSE8 ; 如果当前成绩不在 80~89 分范围内,则跳转到 ELSE8
INC R0
INC R1
SJMP LOOP4
ELSE8:
INC R1
SJMP LOOP4
ELSE7:
MOV S8, R0 ; 将计数器的值存储到 S8 单元中
; 统计 90~99 分的人数
MOV R0, #0
MOV R1, #0
LOOP5:
CJNE R1, #10, ELSE9
MOV A, @R1
CJNE A, #0, ELSE10 ; 如果当前成绩不在 90~99 分范围内,则跳转到 ELSE10
INC R0
INC R1
SJMP LOOP5
ELSE10:
INC R1
SJMP LOOP5
ELSE9:
MOV S9, R0 ; 将计数器的值存储到 S9 单元中
; 统计 100 分的人数
MOV R0, #0
MOV R1, #0
LOOP6:
CJNE R1, #10, ELSE11
MOV A, @R1
CJNE A, #100, ELSE12 ; 如果当前成绩不是 100 分,则跳转到 ELSE12
INC R0
INC R1
SJMP LOOP6
ELSE12:
INC R1
SJMP LOOP6
ELSE11:
MOV S10, R0 ; 将计数器的值存储到 S10 单元中
END
```
这个宏使用了循环和条件判断语句来遍历成绩数组并统计各个分数段的人数,然后将结果存储到相应的单元中。应该注意的是,这个宏只能处理 10 个学生的成绩,如果要处理更多的数据,需要相应地修改代码。
阅读全文