How To Get Python To Use Assembly
Solution 1:
You could create a C extension wrapper for the functions implemented in assembly and link it to the OBJ file created by nasm.
A dummy example (for 32 bit Python 2; not tested):
myfunc.asm:
;http://www.nasm.us/doc/nasmdoc9.html
global _myfunc
section .text
_myfunc:
push ebp
mov ebp,esp
subesp,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>voidmyfunc(void);
static PyObject*
py_myfunc(PyObject* self, PyObject* args){
if (!PyArg_ParseTuple(args, ""))
returnNULL;
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'])])
Build and run:
nasm -fwin32 myfunc.asm
python setup.py build_ext --inplace
python -c"import myext;myext.myfunc()"
Solution 2:
You can also embed assembly directly inside your Python program:
- 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
These work by compiling the assembly and loading it into executable memory at runtime. The first three projects implement x86 assemblers in Python, whereas the last calls out to an external compiler.
Solution 3:
Not sure about the "power" of assembly, really.
You can start here: https://docs.python.org/2/extending/extending.html
It's about extending python with compiled code, written in C or C++, but the principle should be the same (C is really just a portable macro-assembler).
Post a Comment for "How To Get Python To Use Assembly"