如何从另一个汇编文件中调用汇编函数?

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_vectorialsub_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 和汇编文件

如何在汇编语言中嵌入c语言实现求和1+2+3+、、、+100

如何识别IDA反汇编中动态链接库中的函数

Keil中如何用Keil中如何用汇编调用C函数?

dll文件如何反汇编成源码,C++语言编写

如何在64位的linux系统上使用汇编和C语言混合编程