【问题标题】:Should I normalize the signs of my input when computing the average?在计算平均值时,我应该对输入的符号进行归一化吗?
【发布时间】:2013-08-25 15:09:36
【问题描述】:

我正在尝试查找此数组的 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(终止程序) 结束

【问题讨论】:

    标签: assembly tasm


    【解决方案1】:

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

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

    【讨论】:

    • 我将第一部分更改为: SUMUP MOV CX,10 ;数组中的10个变量 MOV AX,0 Sum: MOV AX,[SI] ADD SI,2 ;移动到下一个数字 ADD AVG,AX LOOP Sum 然后我打印了我的总和,我得到了 64541看不懂负数
    • 你需要做一些调试。如您所知,您要查找的总和是–1000。这与 64541 有什么关系?记住要考虑有符号和无符号整数的重要性;如果您不知道这意味着什么,请询问您的导师。
    猜你喜欢
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2017-09-14
    • 2021-01-31
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多