5.1个有符号字数组以0为结束标志,编程求这个数组的最大值、 最小值、平均值。
终于弄明白这道题怎么做了,昨天调了一晚上
先说一下思路,首先要在数据段定义数组,最大值最小值平均值总数正数个位和正数进位还有负数的各位和负数的进位。初值设为0.
然后用子函数调用的命令来执行首先找总数,不是零就加一就好了
然后找最大值,先把第一个数放AX,然后bX放下一个数,比较0,比较是不是比AX大,比AX大就交换。
最小值同理
平均值就麻烦一点,首先取一个数放AX,然后判断是不是0,然后判断是正数还是负数,我们拿负数举例,如果JL,那么就把AX取补,然后把负数1放BX,再把进位放DX,然后ADD AX BX,ADC DX,0 再把他们放回去,达到缓存的目的
找到0之后,首先把进位相减结果放DX,再把低位相减结果放AX,再SBB DX,0,(低位相减可能产生借位)然后IDIV CX cx是总数,最后商AX放平均值就好了!
DATAS SEGMENT
BUF DW 0FFFFH,0001H,0
MAX DW 0
MIN DW 0
AVE DW 0
ZONGSHU DW 0
FUSHU1 DW 0
FUSHU10 DW 0
ZHENGSHU1 DW 0
ZHENGSHU10 DW 0
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
CALL FZONG
CALL FMAX
CALL FMIN
CALL FAVE
;此处输入代码段代码
MOV AH,4CH
INT 21H
MAIN ENDP
FZONG PROC
MOV BX,0
MOV SI,0
L:
MOV AX,BUF[SI]
CMP AX,0
JE EZONG
INC BX
ADD SI,2
JMP L
EZONG:
MOV ZONGSHU,BX
RET
FZONG ENDP
FMAX PROC
MOV SI,0
MOV AX,BUF[SI]
L1:
ADD SI,2
MOV BX,BUF[SI]
CMP BX,0
JE EMAX
CMP AX,BX
JG NMAX
MOV AX,BX
NMAX:
JMP L1
EMAX:
MOV MAX,AX
RET
FMAX ENDP
FMIN PROC
MOV SI,0
MOV AX,BUF[SI]
L2:
ADD SI,2
MOV BX,BUF[SI]
CMP BX,0
JE EMIN
CMP AX,BX
JL NMIN
MOV AX,BX
NMIN:
JMP L2
EMIN:
MOV MIN,AX
RET
FMIN ENDP
FAVE PROC
MOV SI,0
L3:
MOV AX,BUF[SI]
CMP AX,0
JE EAVE
JG ZHENG
JL FU
ZHENG:
MOV BX,ZHENGSHU1
MOV DX,ZHENGSHU10
ADD BX,AX
ADC DX,0
MOV ZHENGSHU1,BX
MOV ZHENGSHU10,DX
ADD SI,2
JMP L3
FU:
MOV BX,FUSHU1
MOV DX,FUSHU10
NEG AX
ADD BX,AX
ADC DX,0
MOV FUSHU1,BX
MOV FUSHU10,DX
ADD SI,2
JMP L3
EAVE:
MOV AX,ZHENGSHU10
MOV BX,FUSHU10
SUB AX,BX
MOV DX,AX
MOV AX,ZHENGSHU1
MOV BX,FUSHU1
SUB AX,BX
SBB DX,0
MOV CX,ZONGSHU
IDIV CX
MOV AVE ,AX
RET
FAVE ENDP
CODES ENDS
END MAIN