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
    

Anmelden zum Antworten