如何让Python使用汇编语言
我刚开始学习汇编语言,但在Python方面已经很有经验了。最近我开始学习适用于Windows的x86_64 NASM汇编,我希望能把汇编的强大和Python的灵活结合起来。我到处查找,但没有找到从Python中调用NASM汇编程序的方法。我说的不是内联汇编,而是想写一个汇编程序,编译它,然后以某种方式提取这个程序,以便在我的Python程序中使用。有人能给我举个简单的例子吗?我现在完全搞不清楚。
3 个回答
3
我其实不太确定汇编语言的“强大”之处。
你可以从这里开始了解:https://docs.python.org/2/extending/extending.html
这个链接讲的是如何用C或C++写的编译代码来扩展Python,但原理应该是一样的(C语言其实就是一种可移植的宏汇编语言)。
11
你可以直接在你的Python程序里嵌入汇编代码:
- https://github.com/Maratyszcza/PeachPy
- https://github.com//pycca/pycca
- http://codeflow.org/entries/2009/jul/31/pyasm-python-x86-assembler/
- https://github.com/AmihaiN/pyAsm
这些工具的工作原理是编译汇编代码,并在程序运行时把它加载到可执行的内存中。前面提到的三个项目是在Python中实现的x86汇编器,而最后一个则是调用外部编译器来完成这个过程。
18
你可以为用汇编语言实现的函数创建一个 C扩展 的包装,并将其链接到由nasm生成的OBJ文件。
下面是一个简单的例子(适用于32位的Python 2;未经过测试):
myfunc.asm:
;http://www.nasm.us/doc/nasmdoc9.html
global _myfunc
section .text
_myfunc:
push ebp
mov ebp,esp
sub esp,0x40 ; 64 bytes of local stack space
mov ebx,[ebp+8] ; first parameter to function
; some more code
leave
ret
myext.c:
#include <Python.h>
void myfunc(void);
static PyObject*
py_myfunc(PyObject* self, PyObject* args)
{
if (!PyArg_ParseTuple(args, ""))
return NULL;
myfunc();
Py_RETURN_NONE;
}
static PyMethodDef MyMethods[] =
{
{"myfunc", py_myfunc, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initmyext(void)
{
(void) Py_InitModule("myext", MyMethods);
}
setup.py:
from distutils.core import setup, Extension
setup(name='myext', ext_modules=[
Extension('myext', ['myext.c'], extra_objects=['myfunc.obj'])])
构建和运行:
nasm -fwin32 myfunc.asm
python setup.py build_ext --inplace
python -c"import myext;myext.myfunc()"