【微机原理作业】汇编程序之成绩汇总

一.作业要求

采用汇编程序实现如下功能:生成一个班的成绩数据(60人,0~100),对成绩进行分类汇总得到不及格学生比例(<60),中比例([60,75]),良比例([75,90]),优比例(>=90)。

二.思路

流程图

三.要点

1.产生随机数

利用时间服务读取时钟计数器的值,产生随机数

RAND PROC
    PUSH CX
    PUSH DX
    PUSH AX
    STI        ; IF置1,允许响应可屏蔽中断
    MOV AH, 0  ; 读时钟计数器值,CX:DX=时钟计数值
    INT 1AH	   ; 调用BIOS中断
    MOV BX, DX ; 随机数存BX
    POP AX
    POP DX
    POP CX
    RET     
RAND ENDP

2.控制随机数的范围在[0, 100]

[0, 100]之间有101个整数,可以采用除以101然后求余数的方法,将数据转为[0, 100]中的随机数。

这里要用到无符号数除法指令 DIV 源操作数
注意:

  1. 指令中使用16位除以8位,32位除以16位的格式。
  2. 被除数、除数都不能为立即寻址。
  3. 被除数放在AX / DX:AX中,在指令中隐含。
  4. 16位运算的商放在AL中,余数放在AH中,32位运算的商放在AX中,余数放在DX中。

DIV

......
; 将随机数控制在[0, 100]之间
START: 
    MOV AX, DATA
    MOV DS, AX         ; 初始化DS    
    MOV CX, 60         ; 60个学生      
    LEA SI, RANDOM     ; 获取RANDOM单元偏移地址   
    LEA DI, SCORE      ; 获取SCORE单元偏移地址  
    XOR AX, AX		   ; 清零
    XOR DX, DX		   ; 清零
            
LP: 
    MOV AL, [SI]       ; 取数据
    MOV DL, 65H        ; 除以101,控制区间               
    DIV DL             ; 无符号数相除,余数放在AX
    MOV SCORE[DI], AH  ; 将数据存入
    
NEXT:   
    INC SI             ; 指针移动    
    INC DI             ; 指针移动 
    XOR AX, AX		   ; 清零    
    LOOP LP
......

3.用分支结构实现成绩分类

将生成的成绩先与90做比较,判断是否为优;
如果结果小于90,与75比较,判断是否为良;
如果结果小于75,与60比较,判断是否为中;

这里要用到的指令:

(1)比较指令 CMP 目的操作数,源操作数

注意:

  1. 该指令执行“目标操作数 - 源操作数”,不产生运算结果,仅影响标志。
    比如对于无符号操作数 AX 和 BX 来说, CMP AX, BX ,若 AX > BX,则标志位 CF = 0;若 AX < BX,则标志位 CF = 1;若 AX = BX,则标志位 CF = 1,ZF = 1。
  2. 指令的目的操作数不能是立即寻址;
  3. 目的操作数和源操作数不能同时为存储器操作数。

CMP

(2)条件转移指令 JC/JNC

指令条件
JCCF = 1
JNCCF = 0
JC
JNC

4.存储成绩分类结果

将成绩分类结果分别存在 YOU、LIANG、ZHONG 和 BUJIGE 中,将计数结果存储在 YOU_COUNT、LINAG_COUNT、ZHONG_COUNT 和 BUJIGE_COUNT 中。

四.完整汇编代码

; 
;*****************************************************************************
; @file       score.asm
; @author     Xiaoxiao
; @date       2020-9-25
; @brief      统计60个学生成绩,得到不及格学生比例(<60),中比例([60,75)),良比例([75,90)),优比例(>=90)   
; @blog       https://blog.csdn.net/weixin_43470383/article/details/108625957
;*****************************************************************************
;

data segment  
    ; 随机、优秀、良好、中等、不及格的成绩
    RANDOM DB 60 DUP(0)    
    YOU DW 60 DUP(0)     
    LIANG DW 60 DUP(0)   
    ZHONG DW 60 DUP(0)   
    BUJIGE DW 60 DUP(0)    
    
    ; 随机、优秀、良好、中等、不及格的个数
    COUNT DW 0           
    YOU_COUNT DW 0       
    LIANG_COUNT DW 0    
    ZHONG_COUNT DW 0     
    BUJIGE_COUNT DW 0    
    
ends                     

code segment  
    ASSUME DS:DATA CS:CODE         
    
START: 
    MOV AX, DATA
    MOV DS, AX      
    MOV CX, 60      ; 60个学生      
    
JUDGE_0:
    CALL RAND       ; 产生随机数,保存在 BL 中
    MOV SI, COUNT
    INC COUNT
    SHL SI, 1
    MOV RANDOM[SI], BL     
    CMP RANDOM[SI], 90 ; 判断是否为优
    JC JUDGE_1       ; 若成绩小于90,跳转
    
YOU_SCORE:
    MOV SI, YOU_COUNT 
    INC YOU_COUNT    ; 成绩为优的个数加一
    SHL SI, 1       
    MOV YOU[SI], BX
    LOOP JUDGE_0
    JMP $
        
JUDGE_1:
    CMP RANDOM[SI], 75 ; 判断是否为良
    JC JUDGE_2       ; 若成绩小于75,跳转

LIANG_SCORE:
    MOV SI, LIANG_COUNT 
    INC LIANG_COUNT  ; 成绩为良的个数加一
    SHL SI, 1        
    MOV LIANG[SI], BX
    LOOP JUDGE_0
    JMP $
          
JUDGE_2:
    CMP RANDOM[SI], 60 ; 判断是否为良
    JC BUJIGE_SCORE  ; 若成绩小于60,跳转

ZHONG_SCORE:
    MOV SI, ZHONG_COUNT 
    INC ZHONG_COUNT  ; 成绩为中的个数加一
    SHL SI, 1
    MOV ZHONG[SI], BX
    LOOP JUDGE_0
    JMP $

BUJIGE_SCORE:
    MOV SI, BUJIGE_COUNT 
    INC BUJIGE_COUNT ; 成绩为不及格的个数加一
    SHL SI, 1
    MOV BUJIGE[SI], BX
    LOOP JUDGE_0
    JMP $
          
RAND  PROC
      PUSH CX
      PUSH DX
      PUSH AX
      STI             ; IF置1,允许响应可屏蔽中断
      MOV AH, 0       ; 读时钟计数器值,CX:DX=时钟计数值
      INT 1AH         ; 调用BIOS中断
      MOV AX, DX      ; 清高6位
      AND AH, 3
      MOV DL, 101     
      DIV DL          ; 除101,产生0~100余数
      MOV BL, AH      ; 余数存BX,作随机数
      POP AX
      POP DX
      POP CX
      RET
RAND  ENDP
    
CODE  ENDS            
     END START        
  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不雨_亦潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值