首页 > 汇编调用printf段错误

汇编调用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

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

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

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

【热门文章】
【热门文章】