2013-05-03 117 views
0

我已经花费了几天的时间,并且仍在积极调试。我正在计算几个数字的平均值并将结果向上或向下舍入。这里有必要的变量声明:MASM大会:浮点计算

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位数。该程序正确计算总数和总数,甚至正确计算平均值,但无法正确计算或显示浮点数。

回答

3

您正在为您的部门使用div;我相信div是一个处理整数值的指令,并且您正在做浮点计算。这就是你得到错误结果的原因。

有你可以做现代的x86 CPU的浮点运算的几种方法:

+0

嗯,这超出了我们现在正在做的,但感谢div的澄清。同学提供了一个解决方案,尽管不是一个优雅的解决方案。 – speedracer 2013-05-04 03:25:53

+0

@ stef2dotoh如果你想知道如何在汇编中做些什么,找出一个好方法是用C++/C实现它,然后看看编译器的反汇编。只是一个提示:) – Aaron 2013-05-04 13:40:07

+0

非常酷!谢谢! – speedracer 2013-05-05 21:19:03

0

可以使用div与DWORD,但你不能用REAL4使用它,你必须使用FDIV 不过,我不浮动数字打交道时,因为你可以使用FILD为真建议使用EAX整数和FLD为小数(这是很容易)

而且答案会是在ST(0),你需要通过调用writefloat而不是调用打印writedec如果你想只显示0.5

你总是可以说

 fld decimal 
    call writefloat