2

我在masm中有这段代码来处理FPU,效果很好

在这段代码中,我从 2 个不同的文本框中得到一个数字,然后将它们分开,然后将结果输出到另一个文本框

这是本地的数据

LOCAL variable1 :QWORD
LOCAL variable2 :QWORD
LOCAL variable3 :QWORD

LOCAL string1[20]:BYTE
LOCAL string2[20]:BYTE
LOCAL string3[20]:BYTE

这是代码

invoke GetDlgItemText,hWin,textbox1,addr string1,9
invoke StrToFloat,addr string1,addr variable1

invoke GetDlgItemText,hWin,textbox2,addr string2,9
invoke StrToFloat,addr string2,addr variable2

finit
fld variable1
fld variable2
fdiv
fstp variable3

invoke FloatToStr,variable3,addr string3
invoke SetDlgItemText,hWin,textbox3,addr string3

我正在尝试将代码转换为 fasm

这是我到目前为止所拥有的,但它不起作用 textbox3 只是说 0

这是数据(这不是本地数据,因为我还没有学会如何在 fasm 中做到这一点)

v1 dq ?
v2 dq ?
v3 dd ?
v4 rb 20

这是代码

invoke GetDlgItemTextA,[hWin],textbox1,addr v1,100 
invoke GetDlgItemTextA,[hWin],textbox2,addr v2,100 

finit
fld qword [v1]
fld qword [v2]
fdivp
fstp qword [v3]

cinvoke wsprintfA,addr v4,"%u",[v3]
invoke SetDlgItemTextA,[hWin],textbox3,addr v4

我知道这段代码不正确,因为我没有在开始时将文本转换为浮动,但我不知道如何

我也尝试了一个更简单的版本,它也不起作用

mov [v1],5.3
mov [v2],7.1

finit
fld [v1]
fld [v2]
fdivp
fstp [v3]

cinvoke wsprintfA,addr v4,"%u",[v3]
invoke SetDlgItemTextA,[hWin],maximumoutputpowertext,addr v4

所以我的问题是有人可以告诉我如何从 2 个不同的文本框中读取一个数字,然后将它们分开,然后使用 fasm 代码将结果返回到另一个文本框

谢谢你

4

1 回答 1

0

演示的代码中有几个问题。

起初,不清楚是什么StrToFloat程序?它是从某个 DLL 导入的,还是代码的一部分,还是其他库的一部分?

如果这个过程被导入,它也必须被导入到 FASM 程序中。否则,它可以从头开始编写或从 MASM 程序以源代码形式移植。

这里的直接展示停止是mov [v1], FLOAT_CONSTANT指令。原因是v1qword 变量,但mov只能移动 dword 立即值(即使在 64 位环境中)。

mov dword [v1], 5.0工作正常,但当然这不是 OP 需要的。浮动 qword 常量也可以在编译时立即定义:v1 dq 3.2

如果我们真的想在运行时设置一些 qword 浮动常量,我们必须通过以下两条指令进行设置:

    a = 5.3

    mov  dword [var], (a and $ffffffff)
    mov  dword [var+4], (a shr 32)

    var dq ?

FASM 语法中的原始 FPU 代码将是:

    finit
    fld  [variable1]
    fdiv [variable2]
    fstp [variable3]
于 2013-09-05T07:46:15.310 回答