汇编调用printf段错误
这段代码可以成功运行,但是我是根据反汇编得到的代码写的,问题是我不清楚mov $0,%eax
这个如果去掉的话为什么就会报段错误。还有寄存器都是e开头的是不是因为我的编译器是32位的?
#printf test
.section .rodata
output:
.string "This is section %d\n"
.section .text
.globl main
main:
mov $output,%edi
mov $1,%esi
mov $0,%eax
call printf
movl $0 ,%edi
call exit
我是这样编译的
as -o prinf.o printf.s
gcc -o prinf printf.o
./printf
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
从参数传递方式看,你使用的应该是x86_64 ABI。你用到的gcc,as都必须是64-bit的。
回答你的问题:
1)eax用于保存在变参数函数调用时,向量参数的个数,你这里没有使用浮点SIMD类操作,所有传入0
2)之所以使用e开头的32位寄存器,是因为编译时使用默认的连接模型,即认为所有代码位于4GB范围以内,好像是SMALL类型,具体请查阅相关资料
这些其实在x86_64 ABI里面都有明确讲述,你先要把相关理论弄清楚再写或看代码就简单了。