【发布时间】: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”,后者是(大部分已死的)安腾架构。