【问题标题】:Pop TWORD variable from FPU stack in TASM从 TASM 中的 FPU 堆栈中弹出 TWORD 变量
【发布时间】:2018-10-26 09:38:31
【问题描述】:

我正在 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,我已经知道了。

【问题讨论】:

  • st0 中返回long double 而不是存储它(并强制调用者重新加载它)会更有效。这也意味着您只需要一个函数,并且您的调用者可以选择是否将其存储为 dword / qword / tbyte 如果他们想要它在内存中。 (当然,在某些调用者中你也会遇到同样的问题,所以这个代码审查评论并没有假装是一个答案。)在 ST0 中返回 FP 值是 i386 System V 调用约定所做的,所以它不是诡异的。也许 16 位约定被设计为使用 soft-float 并在 mem 中传递 FP?

标签: assembly tasm


【解决方案1】:
    FSTP TBYTE PTR [BX]

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

TBYTE PTR 表达式 |理想,MASM

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

【讨论】:

  • 顺便说一句,binutils objdump -d -Mintel / GAS .intel_syntax(类似于 MASM)也使用 fstp TBYTE PTR [rax]NASM uses TWORD.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多