1

この配列の AVG を見つけようとしています: 1742,1065,-67,-2988,-796,-1000,31,-67,-100,1180 番号を POS から NEG に変更する方法は摩耗した。私のプログラムは、上記の配列を計算し、AVG が NEG または POS の場合は massege を出力する必要があり、AVG が POS ではない場合でも常に出力します。これまでの私のコードは次のとおりです。

; lab56.asm
;
    .モデル小
    .STACK 100h
    。データ
AVG_NEG DB 'THE AVG IS NEG',13,10,'$'
AVG_POS DB 'THE AVG IS POS',13,10,'$'
INDEX DB '平均より大きい数字はインデックスにある:',13,10,'$'
RES DB ' ','$'
ARR DW 1742,1065,-67,-2988,-796,-1000,31,-67,-100,1180
テン DW 10
平均 DW 0
tempprint DB ' ','$'
;ここからプログラムを開始します:
    。コード
    MOV AX,@DATA ; DS は、レジスタを介してのみ書き込むことができます
    MOV DS、AX ; データ セグメントを指すように DS を設定する
    LEA SI、ARR
;
; 合計
    MOV CX,10 ; 配列内の 10 個の変数
和:
    MOV AX,[SI]
    CMP AX,0
    JG Pos_label
    XOR AX,0000000000000000b
    ADD AX,0000000000000001b
位置ラベル:
    AVG、AX を追加
    ADD SI,2 ;次の番号に移動
ループサム
; AVG を取得するために 10 で割った値
    CWD; AX -> DX:AX
    IDIVテン
    MOV AVG,AX
; 印刷する

; NEGまたはPOSかどうかを確認します
    CMP AVG,0
    JG Avg_label
    MOV AH,9 ; int 21h の印刷オプションを設定します
    MOV DX、オフセット AVG_NEG ; DS:DX を AVG_NEG を指すように設定します。
    INT 21h
    JMP続行
平均ラベル:
    MOV AH,9 ; int 21h の印刷オプションを設定します
    MOV DX、オフセット AVG_POS ; DS:DX を AVG_POS を指すように設定します
    INT 21h
継続する:
;

;プログラムはここで終了します:

     MOV AH,4Ch ; int 21h の終了オプションを設定します
     INT 21h ; DOS に戻る (プログラムの終了)
     終わり
4

1 に答える 1

1

合計する前にすべての入力の符号を変更すると、明らかに、合計 (オーバーフローを除く) と平均に対して常に同じ符号が得られます。さらに、実際の値ではなくマグニチュードを平均化するため、計算された平均は間違っています。

標識を変更するあなたの方法は確かに間違っているので、そうしないでください。小学校で習ったのと同じ方法で平均を計算するだけです。数字を足して、その数で割ります。

于 2013-08-22T18:31:07.870 に答える