Seite 1 von 2
NASM: String zurückgeben
Verfasst: 27.05.2011 23:38
von Mok
Hallo.
Ich lerne zur Zeit NASM im Selbststudium - geht soweit eigentlich ganz gut, bis ich heute mal ein bisschen mit Strings spielen wollte.
Die ganze Prozedur ist etwas größer, aber ich poste mal den Teil, wo's scheitert:
Code: Alles auswählen
[segment .text]
EXPORT _alpha
[global _alpha]
_alpha:
PUSH ebp
MOV ebp, esp
PUSH esi ; prologue
; [...] etwas Code, der damit nicht zusammenhängt
MOV eax, 'A'
POP esi
POP ebp ; epilogue
RET 4
Wenn ich das kompiliere, linke und als DLL in PB öffne (.s Rückgabetyp wird in Import:EndImport ja nicht unterstützt

), erhalte ich immer ein Ä (ASCII: 196)
Code: Alles auswählen
If OpenLibrary(0,"str.dll")
Prototype.s _alpha (Letter)
alpha._alpha = GetFunction(0, "alpha")
Debug _alpha(1)
EndIf
Das Programm sollte 'A' ausgeben, gibt aber 'Ä' aus. Wenn ich .s (beim Prototype) lösche, bekomme ich 65 (also den ASCII-Wert von 'A'), dazu könnte ich Chr() nehmen... will ich aber nicht!
Also... was mache ich falsch? Das ganze sollte am Ende ohne Chr(), PeekS() o.ä. laufen!
Gruß, Mok.
Re: NASM: String zurückgeben
Verfasst: 28.05.2011 13:25
von edel
Eine PB Stringfunktion gibt nichts zurueck, es wird lediglich ein Speicherbereich befuellt.
Mehr Infos findest du im SDK Ordner in der Readme.txt unter "VI. Managing strings".
Re: NASM: String zurückgeben
Verfasst: 29.05.2011 00:36
von Mok
Ich werd aus dem PB-SDK einfach nicht schlau...
Im Kapitel "Managing Strings" wird kein Wort über in Assembler programmierte Libs verloren, sondern nur über welche, die in Lcc geschrieben wurden.
Ich hab dann mal in den ASM-Dateien im SDK-Verzeichnis rumgekramt und in der ComboBox.asm das externe Symbol "PB_StringBase" gefunden. Hä? Warum denn extern? Ich schätze mal ich muss den String da irgendwie reinschreiben, wenn ich einen String zurückgeben will. Warum kann man nicht einfach, wie in C, eine String-Adresse in eax schreiben und fertig? Scheinbar brauchen wir wieder ein extra Süppchen oder ich hab grad echt ne Latte vorm Kopf (was um die Uhrzeit hoffentlich entschuldigt werden kann)
Re: NASM: String zurückgeben
Verfasst: 29.05.2011 10:59
von edel
Es funktioniert genauso wie in C/C++. In C ist das so aufgebaut :
Code: Alles auswählen
extern "C" char * __stdcall SYS_GetOutputBuffer(int, int);
extern void __stdcall PB_GibMirMeinenTestString(int Pos)
{
char* out;
int len;
len = strlen("TestString");
out = SYS_GetOutputBuffer(len, Pos);
memcopy(out, "TestString",len)
out += len;
*out = 0;
}
In PB ruft man die Funktion mit GibMirMeinenTestString() auf.
Der Parameter "Pos" ist bei Funktionen, die einen String "zurueckgeben"
immer vorhanden, also immer der letzte. Dieser wird aber von PB selber
uebergeben.
Re: NASM: String zurückgeben
Verfasst: 29.05.2011 11:47
von Mok
Boah, ist das kompliziert... aber wo bekomme ich SYS_GetOutputBuffer() für ASM her? Für C ist die ja in Object.h definiert.
Funktioniert das ganze eigentlich nur dann, wenn ich mit polib eine PureLib erstelle, oder funktioniert das auch, wenn ich mit irgendeinem anderen Linker (ich benutz bis jetzt eigentlich immer den VS2010-Linker) eine .DLL oder .LIB mache?
Danke jedenfalls, edel

Re: NASM: String zurückgeben
Verfasst: 29.05.2011 14:13
von edel
In nasm geht das glaube ich so. Das funktioniert dann aber auch nur mit PB, da sonst die Objektdatei mit dem Symbol nicht da ist. Welchen Linker du nimmst, sollte eigentlich Wurst sein.
Re: NASM: String zurückgeben
Verfasst: 29.05.2011 16:35
von Mok
Irgendwie ist der ganze Thread umsonst. Ich habe das ganze nochmal mit PB_StringBase (wie in der ComboBox.asm) probiert, aber es scheitert klarerweise.
Was ich will: Eine LIB- oder eine OBJ-Datei, welche mir einen String zurückgibt. Geht nicht, weil sich PureBasic weigert, eine .s-Prozedur in einem Import:EndImport-Block zu deklarieren. Ich könnte den expliziten Rückgabewert weglassen, aber dann bekomme ich nur eine Adresse.
Was gerade noch akzeptabel ist: Eine DLL. Geht nicht, weil, davon abgesehen, dass es sowieso ein Problem mit der Kombination String + DLL gibt, schon der Link-Vorgang abkackt. Klar, weil das externe Symbol PB_StringBase nicht gefunden werden kann.
Was ich gar nicht will: Irgendwelche Notlösungen in Form von PeekS(), Chr(), UserLib, etc.
Re: NASM: String zurückgeben
Verfasst: 29.05.2011 16:47
von ts-soft
Mok hat geschrieben:Was ich will: Eine LIB- oder eine OBJ-Datei, welche mir einen String zurückgibt. Geht nicht, weil
es eben nicht geht. Es gibt noch kein Stringregister variabler Breite in der CPU. Es wird immer ein Pointer zurückgegeben. Dieser zeigt auf den Stringspeicher, oder dessen länge, oder ..., aber es ist immer ein Pointer.
Keine DLL, keine Lib oder sonst was gibt jemals einen String direkt zurück.
Ob einem in der benutzten Sprache was anderes vorgegaukelt wird, oder PeekS genutzt, sollte dabei auch wurscht sein.
Re: NASM: String zurückgeben
Verfasst: 29.05.2011 17:03
von Mok
ts-soft hat geschrieben:Es gibt noch kein Stringregister variabler Breite in der CPU. Es wird immer ein Pointer zurückgegeben. Dieser zeigt auf den Stringspeicher, oder dessen länge, oder ..., aber es ist immer ein Pointer.
Ich habe nie etwas anderes behauptet. Aber ich frage mich, wie das in PureLibs und UserLibs funktionieren soll. Im Thread war mal von SYS_GetOutputBuffer() die Rede, allerdings wird in der ComboBox_GetGadgetText zwischen eax-Register und PB_StringBase hin- und hergeschoben. Und schlussendlich (klarerweise) die Adresse zurückgegeben.
Re: NASM: String zurückgeben
Verfasst: 29.05.2011 17:26
von edel
Das NASM Beispiel im SDK Ordner ist wohl noch ein Relikt aus 3.94 Tagen