How to get Python to use Assembly

前端 未结 3 831
死守一世寂寞
死守一世寂寞 2021-02-05 13:43

I am a beginner in assembly, but a master in Python. I have just recently started to learn x86_64 NASM for windows, and I wish to combine the power of assembly, and the flexibil

相关标签:
3条回答
  • 2021-02-05 14:24

    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).

    0 讨论(0)
  • 2021-02-05 14:40

    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.

    0 讨论(0)
  • 2021-02-05 14:46

    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 
        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'])])
    

    Build and run:

    nasm -fwin32 myfunc.asm

    python setup.py build_ext --inplace

    python -c"import myext;myext.myfunc()"

    0 讨论(0)
提交回复
热议问题