【发布时间】:2013-10-24 18:30:40
【问题描述】:
我在 FASM 中有这段代码,它使用在 32 位程序中运行良好的 FPU 计算测量值。我将如何转换它以便它可以在 64 位程序中运行。当我在 64 位程序中使用此代码时,它给了我 0.00000 而不是像 54.24457 这样的数字>
macro calculateresultlengthX {
;calculate result length x
;formula is resultlengthX = resultlengthXpixelstextbox / MeasuredlengthXpixelstextbox * MeasuredlengthXtextbox
;read in resultlengthXinpixelstextbox
invoke GetDlgItemTextA, [hwnd], resultlengthxpixelstextbox, bufferbuffer1, 100
cinvoke sscanf, bufferbuffer1, "%f", buffer1
;read in MeasuredlengthXinpixelstextbox
invoke GetDlgItemTextA, [hwnd], measuredlengthxpixelstextbox, bufferbuffer2, 100
cinvoke sscanf, bufferbuffer2, "%f", buffer2
;resultlengthXpixels / MeasuredlengthXpixels
finit
fld dword [buffer1]
fld dword [buffer2]
fdivp
fstp qword [buffer3]
cinvoke sprintf, addr buffer1, "%.16lf", dword [buffer3], dword [buffer3 + 4]
invoke SetDlgItemTextA,[hwnd],resultlengthxtextbox,addr buffer1
;read in ResultlengthXtextbox to get the temporary value
invoke GetDlgItemTextA, [hwnd],resultlengthxtextbox, bufferbuffer1, 100
cinvoke sscanf, bufferbuffer1, "%f", buffer1
;read in MeasuredlengthXtextbox
invoke GetDlgItemTextA, [hwnd],measuredlengthxtextbox, bufferbuffer2, 100
cinvoke sscanf, bufferbuffer2, "%f", buffer2
;answer * MeasuredlengthXtextbox
finit
fld dword [buffer1]
fld dword [buffer2]
fmulp
fstp qword [buffer3]
cinvoke sprintf, addr buffer1, "%.16lf", dword [buffer3], dword [buffer3 + 4]
invoke SetDlgItemTextA,[hwnd],resultlengthxtextbox,addr buffer1
}
谢谢
【问题讨论】:
-
AFAIK,所有 FPU 指令的条目在手册中都说“该指令的操作在非 64 位模式和 64 位模式下是相同的”。也许是别的?
-
我们不使用 64 位的 x87 代码。我们改用 SSE 指令。每个 x64 处理器都支持 SSE。不幸的是,x87 指令在 64 位模式下仍然可用;所以如果你坚持你仍然可以使用它们,但你的代码将是 slllooooowwwwww。
标签: assembly 32bit-64bit x86-64 fpu fasm