汇编语言上机考试三星题5(二刷)

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

你可能感兴趣的:(汇编语言上机考试三星题5(二刷))