【发布时间】: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?