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 printtext到push $printtext.
实际上,你是从地址加载一个值printtext并推送它,而不是推送地址.因此,您将'test'作为32位数字而不是指针传递,并printf尝试将其解释为地址并崩溃.
开始使用汇编语言函数的最佳方法之一是在C中编写类似的函数,然后使用生成汇编列表的编译器开关(-S在gcc上)构建它.然后,您可以研究编译器所做的输出,并根据需要进行修改.
如果您调用的函数printf使用不同的调用约定(因为参数的数量可变),这将特别有用.调用这些函数可能与调用非varargs函数完全不同.
小智 6
问题是我正在使用
pushl printtext
Run Code Online (Sandbox Code Playgroud)
比较起来
pushl $printtext
Run Code Online (Sandbox Code Playgroud)
感谢大家的帮助,抱歉浪费你的时间:P