我现在已经绞尽脑汁待了几天,我仍在积极地调试。我正在尝试计算几个数字的平均值并将结果向上或向下舍入。以下是必要的变量声明:
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
当我尝试只显示十进制中的值时,我 mov eax,十进制并获得一个10位数字。程序正确计算总和和总数,甚至可以正确计算平均值,但我无法正确计算或显示浮点数。
答案 0 :(得分:3)
您正在使用div
进行部门划分;我相信div
是一个适用于整数值的指令,并且您正在进行浮点计算。这就是你得到错误结果的原因。
有几种方法可以在现代x86 CPU上进行浮点运算:
答案 1 :(得分:0)
你可以使用div与dword但你不能用它与real4,你必须使用fdiv 但是,我不建议在处理浮点数时使用eax,因为你可以使用fild作为整数,fld作为小数(这更容易)
答案也是在st(0)中,您需要通过调用writefloat而不是call writedec来打印
如果你想只显示0.5,你总是可以说
fld decimal
call writefloat