Indirekter Call auf Label mit Offset
-
Ich arbeite derzeit an einem Compiler und bin gerade dabei eine V-Table zu implementieren. Leider kenne ich mich aber mit Assembly nicht allzu gut aus.
Ich habe im Moment folgenden Assembly Code:
.LC0: .string "Hello world!\n" .LC1: .string "%d\n" vtable: .int bar .int foo bar: subl $8, %esp movl $10, 4(%esp) movl $.LC1, (%esp) call printf addl $8, %esp ret foo: subl $4, %esp movl $.LC0, (%esp) call puts addl $4, %esp ret .globl main main: pushl %ebp movl %esp, %ebp movl vtable, %edi addl $4, %edi # Wenn ich diese Zeile rausnehme wird bar ohne Segfault aufgerufen call *%edi movl $0, %eax leave ret
Was ich versuche ist das Label 'vtable' zu nehmen und dann mit einem Offset bar (Offset 0) oder foo (Offset 4) aufzurufen. Für bar klappt das auch einwandfrei, bei foo gibt es aber einen Segementation Fault.
Ich habe nun während langer Zeit diverse Dinge ausprobiert, leider ohne Erfolg. Kann mir jemand erklären wie man das richtig macht?
-
Ich glaube ich habs hinbekommen.
.LC0: .string "Hello world!\n" .LC1: .string "%d\n" vtable: .long bar .long foo bar: subl $4, %esp movl $.LC0, (%esp) call puts addl $4, %esp ret foo: subl $8, %esp movl $10, 4(%esp) movl $.LC1, (%esp) call printf addl $8, %esp ret .globl main main: pushl %ebp movl %esp, %ebp movl $vtable, %edi movl 4(%edi), %edi call *%edi movl $0, %eax leave ret