2013-05-03 114 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