【发布时间】: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