【问题标题】:How to get Python to use Assembly如何让 Python 使用 Assembly
【发布时间】:2023-03-19 01:31:01
【问题描述】:

我是汇编初学者,但 Python 高手。我最近刚开始学习 x86_64 NASM for windows,我希望结合汇编的强大功能和 Python 的灵活性。我已经看遍了,我还没有找到在 Python 中使用 NASM 组装过程的方法。我的意思不是在线组装。我希望编写一个汇编程序,对其进行编译,然后以某种方式提取该过程以在我的 Python 程序中使用。有人可以举例说明如何做到这一点,因为我完全迷路了。

【问题讨论】:

标签: python windows assembly 64-bit


【解决方案1】:

您也可以将程序集直接嵌入到您的 Python 程序中:

这些工作通过编译程序集并在运行时将其加载到可执行内存中来工作。前三个项目在 Python 中实现 x86 汇编器,而最后一个项目调用外部编译器。

【讨论】:

    【解决方案2】:

    您可以为汇编中实现的函数创建一个C extension 包装器,并将其链接到由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()"

    【讨论】:

      【解决方案3】:

      真的不确定组装的“力量”。

      您可以从这里开始: https://docs.python.org/2/extending/extending.html

      这是关于用编译代码扩展python,用C或C++编写,但原理应该是一样的(C实际上只是一个可移植的宏汇编器)。

      【讨论】:

      • 我阅读了许多关于如何扩展 python 的文档,但我无法弄清楚这一点,因此提出了这个问题。如果我能从 python 文档页面中弄清楚这一点,我会的。发布一个答案将我引导到甚至不承认该问题的内容(NASM / Assembly / '说明如何')不是答案。对不起。您至少可以展示如何将 C 用作我的案例的汇编程序。
      • C 生成然后编译的程序集(尽管现在这已经很好地隐藏了)。对象格式、符号和所有其他内容对两者都是通用的。您甚至可以在 C 代码中内联汇编。因此,如果您了解在 python 中集成 C 代码所使用的约定,那么它们对于汇编是完全相同的。
      • 这里已经讨论过这个话题:stackoverflow.com/questions/14546610/…
      • 完全不同的问题,看看就读吧。一个是问它是否可能和高效,另一个是是否可以从 NASM 中完成,并将过程作为函数导入 python。
      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2020-05-18
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多