如何从另一个汇编文件中调用汇编函数?
Posted
技术标签:
【中文标题】如何从另一个汇编文件中调用汇编函数?【英文标题】:How can i call a assembly function from another assembly file? 【发布时间】:2016-05-20 00:52:46 【问题描述】:实际上,我正在将 NASM 用于我的学术项目。我们的想法是为数学运算构建一个静态库。
我已经能够在不同的 asm 文件中构建单独的函数。示例:
add_vectorial
有 3 个参数: d,大小 v1,浮点数组 v2,浮点数组 rt,浮点数组,它必须包含运算结果sub_vectorial
有 3 个参数: d,大小 v1,浮点数组 v2,浮点数组 rt,浮点数组,它必须包含运算结果但是我有第三个 asm 文件,它必须调用 2 个函数:add_vectorial 和 sub_vectorial 来做一些微积分。
我读到我必须使用调用词来调用我的外部函数。但我不知道如何传递参数?
我的代码示例:
extern add_vectorial
global operation: ;for linux
operation:
;Initialize a stack frame
push ebp
mov ebp, esp
;Loading the arguments values
mov ebx, [ebp+8] ; ebx='d'
mov ecx, [ebp+12] ; ecx='v1'
mov edx, [ebp+16] ; edx='v2'
mov eax, [ebp+20] ; eax = rt
;Initial the xmm4 registry with zero.
xorps xmm4, xmm4
.body:
;Here, How can i pass the parameters to my asm external function?
call add_vectorial
.done:
;Restore the call's stack frame pointer
leave ; mov esp,ebp / pop ebp
ret ; return from function
【问题讨论】:
【参考方案1】:感谢大家的支持...终于找到了解决问题的方法...我留下了我的解决方案..
%macro call_fun1 4
pushad ;I put this
push %4
push %3
push %2
push %1
call sub_vectorial
add esp, 16 ;4p*4bytes
popad ;I put this
%endmacro
【讨论】:
【参考方案2】:您可以通过在执行调用语句之前将参数压入堆栈来传递参数,也可以先将它们插入寄存器。
【讨论】:
如果要将它们压入堆栈,则需要在调用函数中将它们从堆栈中弹出(C cdecl 的方式)或在 ret 后放置一个数字,告诉它有多少从堆栈中弹出的字节数(C stdcall 的方式) 嗨@cup ..谢谢你的回答。我使用宏来调用我的外部 asm 文件。我举了一个我的代码示例,例如注释。但我有一个新错误。不知道你能不能给我一些解决方案。【参考方案3】:我创建了一个宏来调用我的外部函数,像在 C 中一样传递参数。
%macro call_fun1 4
push %4
push %3
push %2
push %1
call sub_vectorial
add ebp, 16 ;4p*4bytes
%endmacro
仅当我将此代码与我的主 asm 文件集成时,给我以下错误:程序收到信号 SIGSEGV,分段错误。
出于这个原因,我对我的函数进行了一次单元测试,但该函数运行正常。
只有在我与其余代码集成时才会出现错误。
【讨论】:
尝试 添加 esp,16。 esp 是堆栈指针。 ebp 是基指针。当您将项目压入堆栈时,esp 发生变化,ebp 保持不变。 谢谢@cup,我已经纠正了错误,但不幸的是我一直有同样的错误...... sub_vectorial 的返回指令是什么?是 ret 还是 ret 16?如果它是 ret 16,那么它的行为类似于 std 调用,您不需要在退出时添加到 esp。以上是关于如何从另一个汇编文件中调用汇编函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何从汇编例程中调用 C 函数并使用 nasm 和 gcc 链接 C 和汇编文件