assembly - stdcall asm 浮点参数

标签 assembly x86 d

使用 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;

如何传递浮点参数?

最佳答案

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

Accordingall documentation我可以发现所有参数都被压入堆栈。
这包括浮点参数。

如果我在编译器中编译以下代码片段,它会证实这一点:

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) 中返回。

关于assembly - stdcall asm 浮点参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30054280/

相关文章:

assembly - 为什么PUSHAD指令存储ESP?

macos - 'call foo@plt' 的 OSX GNU 汇编程序问题

c - 使用 "int 0x80"调用 Linux 内核系统调用

linux - dmidecode 从哪里获取 SMBIOS 表?

c - 如何知道汇编指令是否存储在新变量中?

d - D 中的固定大小位数组

linux - 如何使用 Glade/GtkD 和 D 编程语言显示 Hello World

multithreading - 程序的工作目录如何/在哪里存储?

algorithm - 击败贪婪算法

c++ - 如何 Hook 不在 Win32 API 中的函数?