我目前在學Simply FPU tutorial。所以作爲我自己的練習,我想了解如何在彙編中劃分浮點。假設我將以17.1分48.6分。這是代碼。X86組件中的浮點除法給出奇怪的結果
format PE console 4.0
entry main
include 'win32a.inc'
section '.data' data readable writeable
num1 dq 48.6
num2 dq 17.1
result dq ?
fmt db "%g", 10
szBuff db 32 dup (0)
section '.code' code readable executable
main:
fld qword [num1]
fld qword [num2]
fdivp
fstp qword [result]
invoke printf, fmt, result
invoke ExitProcess, 0
section '.idata' import data readable
library kernel32,'kernel32.dll', msvcrt,'msvcrt.dll'
import kernel32, ExitProcess,'ExitProcess'
import msvcrt, printf, 'printf'
代碼的輸出是
7.62883e + 265
錯在這裏?
如小丑的建議,我檢查使用OllyDbg的
我猜的結果是正確的代碼,但不知何故,它是由printf的一塌糊塗?
嗨小丑,謝謝你的提示。現在我得到了正確的結果,但不知何故它沒有正確打印。我將不得不再次研究我的代碼。 – anta40
正如你的反彙編所看到的那樣,'invoke printf,fmt,result'宏調用將'result'的地址放在堆棧上,而不是'printf'所期望的'result'本身。 – Jester
是的,你是對的。這部分:「調用printf,fmt,result」應該替換爲「cinvoke printf,fmt,double [result]。FASM有一個叫做cinvoke的宏用於調用C函數,double是qword的C等價物。正確的版本在這裏:http://pastebin.com/11hXKwdF,所以人們可以看到區別:) – anta40