在TASM中从FPU堆栈弹出TWORD变量

时间:2018-05-16 10:58:08

标签: assembly tasm

我正在Turbo Assembler中编写一个程序,它从控制台获取一个数字,根据它计算另一个数字,并将结果打印到控制台上。

我已经完成了从字符串到浮点数的转换以及通过子程序的转换(我认为这不重要,以防万一)。但是,我有问题。我必须使用LONG DOUBLE(TWORD,DT)号码,我就是不能这样做!我可以使用DOUBLE(QWORD,DQ)和FLOAT(DWORD,DD)数字来完成它,但是没有办法使用TWORD。 好的,只是代码(我通过堆栈传递参数,以防万一):

locals  __

...

string_to_float proc near

arg     __ARGS:word:4 = __ARGSIZE

    __ARG struc
        __BP        dw ?
        __IP        dw ?
        __STRING    dw ? ; string address
        __DT        dw ? ; LONG DOUBLE number address
    __ARG ends

...

    mov BX, __DT[BP]
    fstp tword ptr [BX]

...

组装时,TASM说:

  

未定义的符号:TWORD

     

参数需要类型覆盖

它指向我在此处给出的代码的最后一行。

如果我这样做没有问题,例如,使用DOUBLE数字,如下所示:

locals  __

...

string_to_float proc near

arg     __ARGS:word:4 = __ARGSIZE

    __ARG struc
        __BP        dw ?
        __IP        dw ?
        __STRING    dw ?
        __DQ        dw ? ; DOUBLE number address
    __ARG ends

...

    mov BX, __DQ[BP]
    fstp qword ptr [BX]

...

这里可以做些什么?我搜索了TWORD的不同名称,但我只找到了TWORD和DT,我已经知道了。

1 个答案:

答案 0 :(得分:3)

    FSTP TBYTE PTR [BX]

最后检查TD反汇编确实有帮助,甚至检查快速参考指南和fstp指令示例是不够的,那里的例子是错误的,我忽略了第12页中定义的tbyte ptr " Turbo Assembler 5.0快速参考指南":

  

TBYTE PTR 表达 |理想,MASM

     

强制地址表达式为10字节大小