2016-04-16 2 views
-1

Я решал назначение, которое связано с созданием небольшого компилятора. Мой компилятор производит следующий код сборки для постановки простого присваиванияОшибка сегментации (сбрасывание ядра) при выполнении коррекции

// 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 
+1

Чтобы быть ясным, вы имеете в виду, что код, который ваш компилятор генерирует, умирает с ошибкой сегментации при его запуске? –

+0

Ничего очевидно неправильно, вы должны научиться использовать отладчик, чтобы хотя бы идентифицировать инструкцию по сбою. – Jester

+0

@Keith Thompson Да, он умирает, когда я запускаю сгенерированный исполняемый код. – user836026

ответ

2

фактическая ошибка находится в подобной инструкции, но дальше:

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 
+0

Большое спасибо ... это сработало ... хотя, я не совсем уверен, почему это заканчивается тем, что плавает там, я полагаю, у меня есть указатель на float. – user836026

Смежные вопросы