has*_*shy 5 c inline-assembly cython
如何asm()在cython中调用C语言的内联汇编函数?我尝试了一个简单的asm("mov $eax, 0x1") or __asm__(). 它 cythonizes 很好,直到asm-call,然后给我以下错误:
NameError:名称“asm”未定义
我将我的代码编译为python setup.py build_ext --inplace && python runids.py
无法直接从 Cython 调用汇编程序。您能做的最好的事情就是包装asm一个 C 函数并从 Cython 调用它 - 例如使用如下所示的逐字 C 代码(此处适用于 gcc):
%%cython
cdef extern from *:
"""
void inline_asm_fun(void){
__asm__("mov $1, %%eax" ::: "eax");
}
"""
void inline_asm_fun()
def use_inline_asm():
inline_asm_fun()
Run Code Online (Sandbox Code Playgroud)
正如@PeterCordes 所指出的,要在内联汇编器中做一些有用的事情,应该使用扩展 asm,即__asm__("mov $1, %%eax" ::: "eax")而不是 simple 和 unsafe __asm__("mov $1, %eax")。后者会%eax在不通知编译器的情况下进行修改。
对于 MVSC,内联汇编器的非标准扩展是,__asm但仅支持 x86 而不是 x64。