2016-04-16 14 views
-1

Ich war Aufgabe zu lösen, die Erstellung kleiner Compiler beinhalten. Mein Compiler erzeugt den folgenden Assembler-Code für eine einfache ZuordnungsanweisungSegmentierungsfehler (Core Dumped) beim Komplizen

// global declaration 
int k; 

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

Assembly Code (ich bin immer Segmentation fault (core dumped):

# 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 

Als ich gdb verwendet: es zu diesem Punkt Leitung:

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

Um klar zu sein, meinst du, dass der Code, den dein Compiler erzeugt, mit einem Segmentierungsfehler abstürzt, wenn du ihn ausführst? –

+0

Nichts offensichtlich falsch, sollten Sie lernen, einen Debugger zu verwenden, um zumindest die fehlerhafte Anweisung zu identifizieren. – Jester

+0

@Keith Thompson Ja, es stirbt, wenn ich den generierten ausführbaren Code ausführe. – user836026

Antwort

2

Der eigentliche Fehler ist bei einer ähnlichen Anweisung aber weiter unten:

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

Vielen Dank ... es hat funktioniert ... obwohl, ich bin mir nicht ganz sicher, warum es Ende zu haben, dort zu schweben, ich nehme an Zeiger zu schweben. – user836026

Verwandte Themen