使用caml_c_call直接从OCaml调用C 汇编函数

使用caml_c_call直接从OCaml调用C 汇编函数,第1张

概述OCaml允许从OCaml程序调用C函数,只要程序员遵循本手册“使用OCaml连接C”一章中的说明即可. 遵循这些指令时,本机编译器会将对C函数的调用转换为: movq ml_as_z_sub@GOTPCREL(%rip), %rax call caml_c_call@PLT (amd64指令集在这里,但在查看其他架构时,该方案似乎相当统一). 函数caml_c_call最终会 OCaml允许从OCaml程序调用C函数,只要程序员遵循本手册“使用OCaml连接C”一章中的说明即可.

遵循这些指令时,本机编译器会将对C函数的调用转换为:

movq    ml_as_z_sub@GOTPCREL(%rip),%rax    call    caml_c_call@plt

(amd64指令集在这里,但在查看其他架构时,该方案似乎相当统一).

函数caml_c_call最终会执行计算跳转调用*%rax,但它会在之前和之后执行很多 *** 作.来自asmrun / amd64.S:

/* Call a C function from Caml */FUNCTION(G(caml_c_call)).Lcaml_c_call:    /* Record lowest stack address and return address */        popq    %r12        STORE_VAR(%r12,caml_last_return_address)        STORE_VAR(%rsp,caml_bottom_of_stack)    /* Make the exception handler and alloc ptr available to the C code */        STORE_VAR(%r15,caml_young_ptr)        STORE_VAR(%r14,caml_exception_pointer)    /* Call the function (address in %rax) */        call    *%rax    /* Reload alloc ptr */        LOAD_VAR(caml_young_ptr,%r15)    /* Return to caller */        pushq   %r12        ret

当一个人想要经常执行一些既不分配也不提出异常的指令时,上面的内容有点矫枉过正.

有没有人有直接从OCaml调用小程序集的任何经验,而不通过caml_c_call存根?这可能涉及欺骗本机编译器以为它正在调用ML函数或修改编译器.

问题出在Zarith库的上下文中,其中代码的小组件可以直接计算并返回大多数结果,而不必通过caml_c_call,并且只需要跳转到caml_c_code以查找需要分配或异常的困难参数.有关可直接执行的汇编位示例,请参见this file.

解决方法 也许 “noalloc”和“浮动”可能有用吗?

PS更多related links.

总结

以上是内存溢出为你收集整理的使用caml_c_call直接从OCaml调用C /汇编函数全部内容,希望文章能够帮你解决使用caml_c_call直接从OCaml调用C /汇编函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235162.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存