欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

D语言的函数修饰

程序员文章站 2022-05-16 09:35:33
...
D语言的函数修饰 = _D + 函数模块字串的字符个数 + 模块名(默认为文件名) + 函数字符串字符个数 + 函数字符串 + F(Function) + 虚参类型名 + Z + 返回值类型

示例:
module mainXASDA;
void funwq(int,int,int);

修饰名 : _D9mainXASDA5funwqFiiiZv

成员函数修饰 = _D + 函数模块字串的字符个数 + 模块名(默认为文件名) + 类字符串字符个数 + 类字符串 + 成员函数字符串个数 + 成员函数字符串 +  MF(Member Function) + 虚参类型名 + Z + 返回值类型

module mainXASDA;

class zzz{
public:
int aaa(int,int);
}

修饰名 : _D9mainXASDA3zzz3aaaMFiiZi


还有一点 关于 D风格的 函数调用 反汇编看了下 有三个比较独特的地方 ...(Windows 最新的版本的 dmd 未开 -O 优化的情况下)

1. 参数是 从左往右呀进去的 ... 跟 __cdcel/__stdcall 相反
2. 最后一个参数 他是不压的 直接 mov 在 eax 里面 然后 调用 函数 .. 这点比较聪明 函数总是通过 eax 来返回值的 最常修改的就是 eax 寄存器了 不太可能eax 里面存在重要的 上下文 ... vc 里面 ebx 比较重要 上次没保存ebx 程序直接崩溃了 (修改ebx居然会有 修改框架指针的警告 vs2010 esp 为0 会丢失反汇编/调试内容) ...
3. 使用 enter 来生成栈帧 leave 恢复现场然后返回
相关标签: d语言