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 恢复现场然后返回
示例:
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 恢复现场然后返回