在汇编语言中创建库,然后在C语言中调用它?

3
我知道你可以使用 ASM 直接在 C 语言中插入汇编代码,但我想知道是否可以编写一个汇编库,将其编译后从 C 语言中调用其中声明的函数?
我知道应该使用预先编写好的库文件,但这仅限于教育目的和娱乐!例如,如果我想要使用系统调用来打印屏幕输出,现在我编写了一些汇编代码并将其命名为 print 函数,然后将其编译成 .so/.lib/.a 格式的库文件,那么我应该怎样引用该库文件中的函数呢?
我只需要在编译时写出该函数并链接即可吗?
谢谢 :)

1
在那个时候,我应该怎么样才能引用那个库中的函数呢?- 你需要声明它,这样编译器就能了解它的类型、调用约定等信息,然后将从C源代码生成的目标代码和手写汇编生成的目标代码链接在一起。 - undefined
1个回答

0

是的,你只需编写函数并将其编译/汇编为一个 .o 文件。然后,你可以像使用编译器生成的 .o 文件一样使用它。如果你想将其变成一个库,只需将其作为 arranlib 的输入。

在 x86 上使用 gcc 的最简单示例:

将以下内容放入 test.s 文件中:

.globl some_func
some_func:
    ret

编译: cc -c test.s
这将生成一个带有定义了函数some_func的test.o文件。
一个更完整的示例是一个什么都不做的C函数foo,它不接受任何参数(gcc x86-64):
.globl foo
.type   foo, @function
foo:
    pushq   %rbp
    movq    %rsp, %rbp
    leave
    ret

一定要确保你遵守C语言的调用约定。根据平台的不同,一些寄存器可能是被调用者保存的! - undefined
完整的示例确实遵守了gcc的调用约定,因为它没有写入任何x86 GPRs寄存器。证据是这段代码是由gcc生成的。我只是删除了一些标签。 - undefined
我并不是说它不正确!我只是指出,虽然这个例子是正确的,但在PowerPC上可能不适用。OP没有说明他使用的编译器,也没有说明他的目标平台。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接