【发布时间】:2021-06-19 21:20:26
【问题描述】:
如何在cython中调用C语言的内联汇编函数asm()?我尝试了一个简单的asm("mov $eax, 0x1") or __asm__()。在asm-call 之前,它会很好地进行cythonizes,然后给我以下错误:
NameError: name 'asm' 未定义
我将我的代码编译为python setup.py build_ext --inplace && python runids.py
【问题讨论】:
-
除了让
asm()工作之外,您选择的示例非常疯狂。 AT&T 语法mov $eax, 0x1有一个直接源操作数,即符号eax的地址,例如C 全局作用域int eax;,不是寄存器%eax。目标操作数是位于绝对地址1的内存。所以...我猜这不是你想要写的。幸运的是,您没有修改任何寄存器,因此在 GNU C 内联 asm 中作为基本 Asm 语句运行将是一条“安全”指令(regs 或"memory"上没有 clobber 声明),因为该地址不会是任何 C 变量的地址。 -
@PeterCordes 感谢您提供的信息
-
我应该指出的另一点是 GNU C Basic Asm 不安全或不真正可用于除
__attribute__((naked))函数体之外的任何东西,或者在全局范围内(作为单独.s文件)。或者,如果使用在基本 Asm 语句上具有隐式"memory"clobber 的 GCC 版本,则可能是asm("mfence");或没有寄存器的东西。您需要寻找对扩展 Asm 的 Cython 支持,它在 C 中看起来像asm ("inc %0" : "+r"(var));。 gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html -
asm不是函数。它只是碰巧看起来像一个。
标签: c cython inline-assembly