📄 平均值.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 + -