NASM: String zurückgeben

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

NASM: String zurückgeben

Beitrag 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.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: NASM: String zurückgeben

Beitrag 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".
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: NASM: String zurückgeben

Beitrag 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)
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: NASM: String zurückgeben

Beitrag 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.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: NASM: String zurückgeben

Beitrag 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 :allright:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: NASM: String zurückgeben

Beitrag von edel »

Code: Alles auswählen

EXTERN SYS_GetOutputBuffer,2
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.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: NASM: String zurückgeben

Beitrag 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.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: NASM: String zurückgeben

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: NASM: String zurückgeben

Beitrag 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.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: NASM: String zurückgeben

Beitrag von edel »

Das NASM Beispiel im SDK Ordner ist wohl noch ein Relikt aus 3.94 Tagen
Antworten