1

我正在尝试查找此数组的 AVG:1742,1065,-67,-2988,-796,-1000,31,-67,-100,1180 我相信我将数字从 POS 更改为 NEG 的方法是磨损。我的编需要计算上面的数组,然后打印 massege,如果 AVG 是 NEG 或 POS,它总是打印 AVG 是 POS,即使它不是。到目前为止,这是我的代码:

; lab56.asm
;
    .模型小
    .STACK 100h
    。数据
AVG_NEG DB '平均值为负值',13,10,'$'
AVG_POS DB 'THE AVG IS POS',13,10,'$'
INDEX DB '大于平均值的数字在索引中:',13,10,'$'
RES 数据库 '','$'
ARR DW 1742,1065,-67,-2988,-796,-1000,31,-67,-100,1180
十 DW 10
平均深度 0
模板数据库'','$'
;程序从这里开始:
    。代码
    移动 AX,@DATA ; DS 只能通过寄存器写入
    MOV DS,AX ; 设置 DS 指向数据段
    LEA SI, ARR
;
; 总结
    MOV CX,10 ;10 个变量在数组中
和:
    MOV AX,[SI]
    CMP AX,0
    JG Pos_label
    异或 AX,0000000000000000b
    添加 AX,0000000000000001b
位置标签:
    添加平均,AX
    ADD SI,2 ;移动到下一个数字
循环总和
; 除以 10 得到 AVG
    顺时针; AX -> DX:AX
    IDIV 十
    MOV AVG,AX
; 打印

; 检查是 NEG 还是 POS
    CMP 平均,0
    JG Avg_label
    MOV 啊,9;设置 int 21h 的打印选项
    MOV DX,OFFSET AVG_NEG ; 将 DS:DX 设置为指向 AVG_NEG
    INT 21 小时
    JMP 继续
平均标签:
    MOV 啊,9;设置 int 21h 的打印选项
    MOV DX,OFFSET AVG_POS ; 将 DS:DX 设置为指向 AVG_POS
    INT 21 小时
继续:
;

;程序结束在这里:

     MOV AH,4Ch ; 为 int 21h 设置终止选项
     INT 21 小时;返回 DOS(终止程序)
     结尾
4

1 回答 1

1

如果您在将所有输入加在一起之前更改了所有输入的符号,那么您显然总是会得到相同的总和符号(除非溢出),因此对于平均值也是如此。此外,计算的平均值将是错误的,因为您将平均幅度而不是实际值。

你改变星座的方法确实是错误的,所以不要那样做。只需按照您在小学学习的相同方式计算平均值:将数字相加并除以计数。

于 2013-08-22T18:31:07.870 回答