汇编调用printf段错误

发布于 2022-08-29 17:02:56 字数 456 浏览 7 评论 0

这段代码可以成功运行,但是我是根据反汇编得到的代码写的,问题是我不清楚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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦魇绽荼蘼 2022-09-05 17:02:56

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文