QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 917|回复: 4

Linux下面汇编碰到的问题

[复制链接]
发表于 2004-6-4 11:06:53 | 显示全部楼层 |阅读模式
想用汇编实现printf的调用,用如下命令行编译
gcc -c test.s
gcc -o test test.o
执行test时会出现Segmentation Fault.请大家帮帮忙
test.s代码如下
[code:1]
        # standard Curry preamble
          .section .data
          
          _IntStyle: .asciz "%d"
          _DoubleStyle: .asciz "%f"
          _True: .asciz "TRUE"
          _False: .asciz "FALSE"
          .text
          .globl main
          .type main, @function
  main:
        # BeginMainFunc 4
          pushl        %ebp
          movl        %esp, %ebp
          subl        $4, %esp         # decrement sp to make space for locals/temps
          andl        $-16, %esp         # align the stack pointer for performance reasons
        # the next two instruction is generated to initialize the accumulator,
        # and also to reset the condition flags
          movl        $0, %eax
          subl        %eax, %esp
        # the body of main follows
        # _tmp0 = 2
          movl        $2, %eax        # load constant value 2 into %eax
        # PushParam _tmp0
          pushl        %eax        # copy param value to stack
        # LCall _PrintInt
        # (save modified registers before flow of control change)
          movl        %eax, 4(%ebp)        # spill _tmp0 from %eax to %ebp+4
          movl        %esp, %esi        # save %esp in %esi
          pushl        $_IntStyle
          call        printf
          movl        %esi, %esp        # restore %esp
        # PopParams 4
          addl        $4, %esp        # pop params off stack
        # EndFunc
        # (below handles reaching end of fn body with no explicit return)
          leave
          ret

[/code:1]
发表于 2004-6-4 12:23:37 | 显示全部楼层
不懂汇编,呵呵,帮顶
回复

使用道具 举报

发表于 2004-6-5 10:41:40 | 显示全部楼层
我觉得,这一句有问题
程序一开始增加了32bytes的栈
[code:1]subl   $4, %esp[/code:1],
而ebp里放的是增加栈之前的栈顶指针,所以,要放临时变量,要用esp(因为压了一次栈,所以用4(esp),或者用-4(ebp)来得到程序开始开辟的临时变量的地址.

[code:1]
movl   %eax, 4(%ebp)   # spill _tmp0 from %eax to %ebp+4
[/code:1]
应改为
[code:1]
movl   %eax, -4(%ebp)   
[/code:1]
或者
[code:1]
movl   %eax, 4(%esp)   
[/code:1]

另,我没看出来你这句有什么用,因为后来没有用到eax的值,所以,也可以直接去掉
回复

使用道具 举报

发表于 2004-6-5 18:19:59 | 显示全部楼层
有道理,试了试输出2
回复

使用道具 举报

 楼主| 发表于 2004-6-5 18:35:20 | 显示全部楼层
谢谢,我也找到错误的地方了。上面有一个位移变量用错了,应该是-4结果我用的是4。
其实这不是我手写的代码,是我写的编译器生成的代码。
由于我没有做本地优化,所以有些代码看起来可能很笨的样子:-P。

真得很感谢yunfan,也谢谢两位斑竹
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 04:42 , Processed in 0.077839 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表