【发布时间】:2015-11-15 03:14:40
【问题描述】:
我需要将两个实数从 C (using extern 'C' double (double num1,double num2)) 发送到返回加法的程序集 procedure这些数字。我还不知道该怎么做。
我试过了,但是没有用。
.data
res dq 0
.code
procSuma proc num1,num2
fld num1 ; load num1 and push it onto the fpu stack
fld num2 ; load num2 and push it onto the fpu stack
faddp ; pop two numbers, add them, push sum on the stack
fstp res ; pop sum from the stack and store it in res
procSuma endp
end
【问题讨论】:
-
“没用”是什么意思?没有编译,没有产生正确的结果,还有什么?
-
Windows 上的调用约定说 st(0) 应该包含双精度的返回值。所以你应该能够完全消除
res变量,摆脱fstp res。faddp应该将两个值相加并将结果放入st(0),因此您只需要在之后执行ret。由于您将双浮点数传递给 procSuma 您应该将procSuma proc num1,num2更改为procSuma proc num1:REAL8,num2:REAL8以便 MASM 知道您的两个参数是 REAL8(8 字节) -
另一个问题可能是您应该指定
PROC C而不是PROC以便 MASM 使用 C 调用约定设置过程。所以procSuma proc num1:REAL8,num2:REAL8应该是procSuma proc C num1:REAL8,num2:REAL8 -
仅供参考,在 2015 年学习 x87 FPU 并没有太大用处。如果你真的想要,有一个很好的教程链接自 the x86 tag wiki。对于新代码,请使用 SSE/SSE2,除非您需要向后兼容古老的 32 位 CPU(例如 Athlon XP 是最后一个不支持 SSE2 的 CPU)。 32bit ABI 在
st(0)中返回浮点结果,因此您无法在 32bit 代码中完全避免它,这也是 32bit 很糟糕并且应该被视为过时的另一个原因。 -
@PeterCordes x87 指令集仍然提供扩展双精度格式和 64 位精度的操作,因此在 2015 年非常有用。不过,几乎没有理由从汇编中使用它。