汇编调用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
阅读 5.2k
1 个回答

从参数传递方式看,你使用的应该是x86_64 ABI。你用到的gcc,as都必须是64-bit的。

回答你的问题:
1)eax用于保存在变参数函数调用时,向量参数的个数,你这里没有使用浮点SIMD类操作,所有传入0
2)之所以使用e开头的32位寄存器,是因为编译时使用默认的连接模型,即认为所有代码位于4GB范围以内,好像是SMALL类型,具体请查阅相关资料

这些其实在x86_64 ABI里面都有明确讲述,你先要把相关理论弄清楚再写或看代码就简单了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进