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 exitDen 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.libDas 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, 4bzw.
push [_temp] call _tellme add esp, 4nur 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?