0

私は数日間頭を悩ませてきましたが、まだ積極的にデバッグしています。いくつかの数値の平均を計算し、結果を切り上げまたは切り捨てようとしています。必要な変数宣言は次のとおりです。

totalNum        DWORD   ?
sum         DWORD   ?   ; sum of numbers
avg         DWORD   ?
rem         DWORD   ?
decimal     REAL4   0.5

コードスニペット:

; ********************
; * calculateAverage *
; ********************
mov eax, sum
mov ebx, totalNum
cdq
div ebx
mov avg, eax        ; save average
mov rem, edx        ; save remainder

mov eax, rem        ; divide divisor (totalNum) by remainder to round up/down
mov ebx, totalNum
cdq
div ebx

cmp eax, decimal    ; compare result to .5
jge roundUp     ; if >= .5, jump to roundUp
jmp endRoundUp

roundUp:            ; round up average
    add avg, 1
endRoundUp:

; ******************
; * displayResults *
; ******************
mov edx, OFFSET countText1  ; display total numbers entered
call WriteString
mov eax, totalNum
call    WriteDec
mov edx, OFFSET countText2
call WriteString
call    Crlf
mov edx, OFFSET sumText     ; display sum of numbers entered
call WriteString
mov eax, sum
call    WriteDec
call    Crlf

mov edx, OFFSET avgText     ; display rounded average of numbers entered
call WriteString
mov eax, avg
call    WriteDec

値をdecimalで表示しようとすると、eax、decimalを移動して 10 ビットの数値を取得します。プログラムは合計数と合計数を正しく計算し、平均も正しく計算しますが、適切に丸めたり、浮動小数点数を表示したりできません。

4

2 に答える 2

3

あなたdivの部門に使用しています。はdiv整数値で機能する命令であり、浮動小数点計算を行っていると思います。そのため、間違った結果が得られます。

最新の x86 CPU で浮動小数点演算を実行するには、いくつかの方法があります。

  • x87 浮動小数点命令の使用。
  • SIMD と SSEを使用すると、さまざまな方法で実行できます。AVXもいくつかのソリューションを提供していると確信しています。
于 2013-05-04T01:16:11.910 に答える
0

dword では div を使用できますが、real4 では使用できません。fdiv を使用する必要があります。はるかに簡単です)

また、答えは st(0) にあり、 writedec を呼び出す代わりに writefloat を呼び出して出力する必要があります。

0.5 だけを表示したい場合は、いつでも言うことができます

     fld decimal
   call writefloat
于 2013-12-06T23:11:26.477 に答える