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显示值时,我mov eax, decimal并获得一个 10 位数字。该程序正确计算总和和总数,甚至正确计算平均值,但我无法正确舍入或显示浮点数。

4

2 回答 2

3

您正在使用div您的部门;我相信这div是一条适用于整数值的指令,而您正在进行浮点计算。这就是为什么你得到错误的结果。

有几种方法可以在现代 x86 CPU 上进行浮点运算:

于 2013-05-04T01:16:11.910 回答
0

您可以将 div 与 dword 一起使用,但不能将其与 real4 一起使用,您必须使用 fdiv 但是,我不建议在处理浮点数时使用 eax,因为您可以将 fild 用于整数,将 fld 用于小数(其中容易得多)

答案也将在 st(0) 中,您需要通过调用 writefloat 而不是调用 writedec 来打印

如果你只想显示 0.5 你总是可以说

     fld decimal
   call writefloat
于 2013-12-06T23:11:26.477 回答