⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 平均值.asm

📁 用汇编编写的
💻 ASM
字号:
        DATA  SEGMENT
         BUF  DB        1,5,4,0,7,9,2,6,8,3
       COUNT  EQU       $-BUF-1
        DATA  ENDS
        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA
      START:  MOV       AX,DATA
              MOV       DS,AX
  ;--------------------------------------------------------数据处理部分--------   
              MOV       BL,0        ;置子程序参数(0是查找最小数,否则查找最大数)
              MOV       CX,COUNT    ;置子程序参数(第一次循环查找COUNT次)
              CALL      FIND        ;查找最小数地址
              CALL      DEL         ;删除最小数
              MOV       BL,1
              DEC       CX          ;置子程序参数(第二次循环查找COUNT-1次)
              CALL      FIND        ;查找最大数地址
              CALL      DEL         ;删除最大数
  ;---------------------------------------------------------求和部分----------   
              DEC       CX          ;置循环求和次数
              LEA       SI,BUF
              MOV       AL,[SI]
        NUM:  INC       SI
              ADD       AL,[SI]     ;循环求和
              LOOP      NUM
  ;----------------------------------------------------------求平均值部分------   
              MOV       AH,0        ;扩展为16位AX
              MOV       BL,COUNT-1  ;置除数值(08H)
              DIV       BL          ;求平均值:AX/BL   24H/08H
              CMP       AH,0        ;若余数为0
              JZ        NEXT        ;则将商直接存入存储器单元
              PUSH      AX          ;否则保存商
              MOV       AL,AH       ;将余数存放AL
              MOV       DL,0AH      ;置乘数为0AH
              MUL       DL          ;AL*DL=AX
              DIV       BL          ;AX/BL   28H/08H
              CMP       AL,5        ;若商小于5
              JB        NEXT        ;则直接存入存储器单元
              POP       AX
              INC       AL          ;否则将商加1
       NEXT:  MOV       [SI+1],AL   ;保存四舍五入后的平均值
  ;----------------------------------------------------------------------------------   
              MOV       AH,4CH
              INT       21H         ;程序退出
  ;==============================================删除地址DX对应的存储器数据子程序   
         DEL  PROC      NEAR
              PUSH      CX
              SUB       CX,DX       ;置循环次数
              MOV       SI,DX
        ROP:
              MOV       BL,[SI+1]   ;目标数据的后一个数据存入bl
              MOV       [SI],BL     ;将后一个数据移到前一个数据
              INC       SI          ;修改地址
              LOOP      ROP
              MOV       BYTE   PTR[SI],0
              POP       CX
              RET
         DEL  ENDP
  ;==============================查找数组中指定数据地址存入DX(最大数,最小数)子程序   
        FIND  PROC      NEAR
              PUSH      CX
              LEA       SI,BUF
              MOV       AL,[SI]     ;取第一个数
              INC       SI
              CMP       BL,0        ;若为0,则为查找最小数,否则为查找最大数
              JZ        SMALL1
      BEGIN:  CMP       AL,[SI]     ;查找最大数,第一个数与第二数比较
              JAE       TOP         ;若大于等于则转
              MOV       AL,[SI]     ;记录最大值
              MOV       DX,SI       ;否则将最大数地址保存在DX中
        TOP:  INC       SI
              LOOP      BEGIN
              JMP       EXIT
     SMALL1:  CMP       AL,[SI]     ;查找最小数,第一个数与第二数比较
              JBE       TOP1        ;若小于等于则转
              MOV       AL,[SI]
              MOV       DX,SI       ;否则将最小数地址保存在DX中
       TOP1:  INC       SI
              LOOP      SMALL1
       EXIT:  POP       CX
              RET
        FIND  ENDP
        CODE  ENDS
              END       START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -