如何在cython中调用C内联汇编asm?

How to call C inline assembly asm in cython?

如何在cython中调用C语言的内联汇编函数asm()?我尝试了一个简单的asm("mov $eax, 0x1") or __asm__()。它在 asm-调用之前很好地进行了 cythonizes,然后给我以下错误:

NameError: name 'asm' is not defined

我将我的代码编译为 python setup.py build_ext --inplace && python runids.py

无法直接从 Cython 调用汇编程序。你能做的最好的事情是将 asm 包装在 C 函数中并从 Cython 调用它 - 例如使用 verbatim C-code 像这样(这里是 gcc):

%%cython

cdef extern from *:
    """
    void inline_asm_fun(void){
        __asm__("mov , %%eax" ::: "eax");
    }
    """
    void inline_asm_fun()
    
def use_inline_asm():
    inline_asm_fun()

正如@PeterCordes 指出的那样,要在内联汇编程序中做一些有用的事情,应该使用 extended asm,即 __asm__("mov , %%eax" ::: "eax") 而不是简单且不安全的 __asm__("mov , %eax")。后者会在不通知编译器的情况下修改 %eax

对于 MVSC,内联汇编程序的非标准扩展是 __asm,但它仅支持 x86,不支持 x64。