遵循这些指令时,本机编译器会将对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 /汇编函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)