从c调用汇编函数

26 c linux assembly gnu-assembler

我正在尝试在程序集中使用函数,从C项目调用.这个函数应该调用一个libc函数printf(),但我一直遇到分段错误.

在.c文件中,我有函数的声明让我们说

int do_shit_in_asm()
Run Code Online (Sandbox Code Playgroud)

在我的.asm文件中

.extern printf
.section .data
         printtext:
              .ascii "test"
.section .text
.global do_shit_in_asm
.type do_shit_in_asm, @function

do_shit_in_asm:
    pushl %ebp
    movl %esp, %ebp
    push printtext
    call printf
    movl %ebp, %esp
    pop %ebp
ret
Run Code Online (Sandbox Code Playgroud)

任何指针评论将不胜感激.

as func.asm -o func.o

gcc prog.c func.o -o prog
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 16

更改push printtextpush $printtext.

实际上,你是从地址加载一个值printtext并推送它,而不是推送地址.因此,您将'test'作为32位数字而不是指针传递,并printf尝试将其解释为地址并崩溃.


Gre*_*ill 9

开始使用汇编语言函数的最佳方法之一是在C中编写类似的函数,然后使用生成汇编列表的编译器开关(-S在gcc上)构建它.然后,您可以研究编译器所做的输出,并根据需要进行修改.

如果您调用的函数printf使用不同的调用约定(因为参数的数量可变),这将特别有用.调用这些函数可能与调用非varargs函数完全不同.


小智 6

问题是我正在使用

pushl printtext
Run Code Online (Sandbox Code Playgroud)

比较起来

pushl $printtext
Run Code Online (Sandbox Code Playgroud)

感谢大家的帮助,抱歉浪费你的时间:P