【问题标题】:Segmentation fault (core dumped) when making compliation编译时出现分段错误(核心转储)
【发布时间】:2016-04-16 18:41:19
【问题描述】:

我正在解决涉及创建小型编译器的任务。我的编译器为简单的赋值语句生成以下汇编代码

// global declaration
int k;

float x,y,z;
// inside main func
k=10;
x = y = k;

汇编代码(我遇到分段错误(核心转储)

 #   19
                    # b_push_ext_addr (x)
        subl    $8, %esp
        movl    $x, (%esp)
                    # b_push_ext_addr (y)
        subl    $8, %esp
        movl    $y, (%esp)
                    # b_push_ext_addr (k)
        subl    $8, %esp
        movl    $k, (%esp)
                    # b_deref (signed int)
        movl    (%esp), %eax

# Proplm on next Line ... why?
         movl (%eax), %edx


        movl    %edx, (%esp)
                    # b_convert (signed int -> float)
        fildl   (%esp)
        fstps   (%esp)
                    # b_assign (float)
        movl    (%esp), %edx
        addl    $8, %esp
        movl    (%esp), %eax
        movl    %edx, (%eax)
        movl    %edx, (%esp)
                    # b_deref (float)
        movl    (%esp), %eax
        movl    (%eax), %edx
        movl    %edx, (%esp)
                    # b_convert (float -> double)
        flds    (%esp)
        fstpl   (%esp)
                    # b_convert (double -> float)
        fldl    (%esp)
        fstps   (%esp)
                    # b_assign (float)
        movl    (%esp), %edx
        addl    $8, %esp
        movl    (%esp), %eax
        movl    %edx, (%eax)
        movl    %edx, (%esp)
                    # b_pop ()
        addl    $8, %esp

当我使用 gdb 时:它指向这一行:

(gdb) x/i $eip
=> 0x80485bd <main+336>:        mov    (%eax),%edx

【问题讨论】:

  • 明确地说,您的意思是您的编译器生成的代码在您运行时会因分段错误而死掉?
  • 没有什么明显的错误,你应该学会使用调试器至少识别错误指令。
  • @Keith Thompson 是的,当我运行生成的可执行代码时它会死掉。
  • @Jester 我是新手。我用于汇编代码的调试器。
  • 取决于平台和您熟悉的内容。在linux上默认是gdb,但是有些人处理不了;)

标签: assembly compilation compiler-construction


【解决方案1】:

实际的错误是在类似的指令,但更进一步:

    fstps   (%esp)       # stack has some float
                # b_assign (float)
    movl    (%esp), %edx # edx has a float now
    addl    $8, %esp
    movl    (%esp), %eax
    movl    %edx, (%eax)
    movl    %edx, (%esp) # write the float onto stack
                # b_deref (float)
    movl    (%esp), %eax # load the float from stack
    movl    (%eax), %edx # try to use float as pointer => segfault

【讨论】:

  • 非常感谢......它工作......虽然,我不太确定为什么它会在那里浮动,我想有指向浮动的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多