Frage zu FASM und C-Library (ja, ich bin ein N00b!)



  • Hallo!

    ich möchte grad ein wenig Assembler lernen, und gehe den Weg, es learning-by-doing zu tun. Ich nutze den FASM, Version 1.67.26 unter Windoofs XP.

    Meine Konstellation sieht wiefolgt aus.

    Eine "C-Library" test1.c:

    #include <stdlib.h>
    #include <stdio.h>
    
    void test( char** x )
    {
      *x = malloc( 20+1 );
      strcpy( *x, "Hello World" );
    }
    
    void tellme( char* s )
    {
      printf( ">%s<\n", s );
      free( s );
    }
    

    Und das Assemblerprogramm test.asm, welches erst test() aurufen soll, um einen Pointer zu allokieren, und tellme(), um den String wieder auszugeben und den Speicher freizugeben.

    format MS COFF
    
    public main as '_main'
    
    extrn '_exit'	as exit
    extrn '_test'	as _test
    extrn '_tellme'	as _tellme
    
    section '.data' data readable writeable
    
    _temp db ?
    
    section '.text' code readable executable
    
    main:
    	push _temp
    	call _test
    	add esp, 4
    
      push _temp
    	call _tellme
    	add esp, 4
    
    	push	0
    	call	exit
    

    Den build führe ich zusammen mit MS Visual C++ Express 2005 folgendermaßen durch:

    cl /c test1.c
    lib test1.obj
    fasm test.asm
    link test.obj test1.lib libcmt.lib

    Das Resultat allokiert erfolgreich den Speicher für die Variable _test, nur mein Problem ist jetzt, das ich den String nicht mit der Funktion

    void tellme( char* s )
    {
      printf( ">%s<\n", s );
      free( s );
    }
    

    ausgeben kann, was ja auch klar ist, weil ich ihr den Pointer auf den Pointer zu s übergebe. Mit der Funktion

    void tellme( char** s )
    {
      printf( ">%s<\n", *s );
      free( *s );
    }
    

    klappt das natürlich.

    Meine Ansätze im Assembler waren nun die Aufrufe so zu ändern:

    push offset _temp
    	call _test
    	add	esp, 4
    

    bzw.

    push [_temp]
    	call _tellme
    	add	esp, 4
    

    nur der FASM mag das nicht und meckert rum. Grund für dieses Problem ist, das ich einfach doof bin und es schlicht nicht weis, was ich falsch mache - daher, wer kann mir nen Tipp geben?

    Dank' UND Gruß

    Ein N0000000000000000000B!



  • nur der FASM mag das nicht und meckert rum.

    Aus reiner Neugier, was meckert denn da der FASM genau?


Anmelden zum Antworten