#ifndef _CALLBACK_H_
#define _CALLBACK_H_
typedef void Callback(void*, void*);
#define CALLBACK_ARG_TYPE void*
#define DEFINE_DO_CALLBACK() \
void DoCallback(void* obj, Callback cb, \
CALLBACK_ARG_TYPE arg ) { \
cb(obj, arg); \
}
#define DECLARE_CALLBACK(type, mfn) \
static void __cb_##mfn##__(void* s, \
CALLBACK_ARG_TYPE arg) {\
((type*)s) -> mfn (arg); \
} \
void mfn (CALLBACK_ARG_TYPE)
#define CALLBACK(mfn) __cb_##mfn## __
#endif // _CALLBACK_H_
sudo dpkg -i --force--all <packagename.deb>
想要了解Go的底层机制,必须了解其与汇编程序(plan9 asm)混合工作的方法,以下是个人的一些总结。
1, 形式
在go文件中添加包和函数的声明,在s文件中实现函数,分别使用8g和8c处理后,用gopack打包成a文件,安装到包目录中。然后就可以在一般的go文件中导入混合实现的包了。
2, 汇编函数格式
TEXT <package name>·<func name>+0(SB),$X-Y
<instructions>
RET
<package name> : 包名,可省略
<func name> : 函数名
<instructions> : 指令序列
X : 自动变量占用的栈空间
Y : 参数和返回值占用的栈空间
包名与函数名之间的点为间隔符,vim中的输入方式为<C-V>u00b7
3, 参数、返回值的传递方式
从右到左,在栈中留出返回值的空间,参数压入栈中。
4, 栈空间维护
plan9汇编中,自动实现函数栈空间的维护,不需要显式的维护操作。在函数的第一行,给出了自动变量、参数和返回值的空间大小。进入函数后,name+0(FP)指向返回地址,386架构中, name+4(FP)指向第一个参数。FP(frame pointer)是一个伪寄存器,使用时必须加上参数名称: name+0(FP),name可为任意值。SP为真实的栈指针,指向第一个自动变量。
参考:
最新评论