【问题标题】:stdcall asm floating point parametersstdcall asm 浮点参数
【发布时间】:2015-05-05 13:24:43
【问题描述】:

使用 D 内联汇编我试图实现动态调用 stdcall 函数(使用动态参数)

我有以下程序集 args 是指向 32 位整数数组的 void 指针 argc 是参数个数 ret 是 void 指针,address 是函数地址

 MOV EBX, 0;
 iterator:
 MOV EAX, DWORD PTR [args];
 PUSH EAX;
 ADD EBX, 1;
 ADD EAX, 4;
 CMP EBX, DWORD PTR argc;
 JNE iterator;
 MOV EAX, ADDress;
 CALL EAX;
 MOV [ret], EAX;
 RET 0;

浮点参数是如何传递的?

【问题讨论】:

  • 在堆栈上,就像其他一切一样。 PS:你不需要将指针加载到EAX,你可以做call dword ptr [Address]。另请注意,如果您使用push,则需要颠倒参数顺序。
  • 调用约定通常取决于语言、体系结构和操作系统。在 x86 上,浮点值被压入浮点堆栈。
  • @qznc,不,甚至没有关闭。
  • @qznc 你听说过 SIMD 吗?在 x86_64 上,浮点堆栈已被弃用,您使用它的风险是不一致(如果您不知道发生了什么)和缓慢
  • 你是对的,因为我们谈论的是不同的架构。 x86 != x86_64。旁注,您肯定是在说“amd64”,而不是“x86_64”,后者是(大部分已死的)安腾架构。

标签: assembly x86 d


【解决方案1】:

微软在这个问题上非常沉默。
这是因为stdcall 仅用于 WinAPI 调用。
而且我所知道的没有 WinAPI 调用接受浮点参数。

According到alldocumentation我可以找到所有的参数都压栈了。
这包括浮点参数。

如果我在我的编译器中编译以下 sn-p,它会确认这一点:

void __stdcall test3(double a, double b, double c) {
};     
.....
test3(a,b,c);
.....
//This produces the following code as per the stdcall convention. 
004182B4 55               push ebp
004182B5 8BEC             mov ebp,esp
004182B7 83C4E8           add esp,-$18
004182BA FF75EC           push dword ptr [ebp-$14]
004182BD FF75E8           push dword ptr [ebp-$18]
004182C0 FF75F4           push dword ptr [ebp-$0c]
004182C3 FF75F0           push dword ptr [ebp-$10]
004182C6 FF75FC           push dword ptr [ebp-$04]
004182C9 FF75F8           push dword ptr [ebp-$08]
004182CC E8ABFFFFFF       call Test3

请注意,浮点返回值在 ST(0) 中返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 2016-06-26
    • 2016-10-21
    • 2021-06-22
    • 2014-05-17
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多