StrLen in ASM+Frage zu malloc[Erledigt]
-
Hy, ich bräuchte mal eure Hilfe.
Ich hab eine Funktion geschrieben die eigentlich die Länge des übergebenen Strings ermitteln sollte, nur leider funktioniert sie nicht. Was mache ich falsch bzw. kennt ihr eine schnellere Methode? Ich benutze den FASM.proc StrLen Text:DWORD mov ebx,[esp+4] mov eax,[ebx-1] top: inc eax cmp eax,0 jnz top sub eax,ebx ret endp
Danke schonmal
-
wie würde den der funktionsprototyp in C aussehen? ich kann hier nämlich überhaupt nicht auch nur vom ansatz erkennen, was du dir bei dieser funktion gedacht hast. derzeit zählst du einfach nur eine zahl in eax hoch und vergleichst die mit 0 (ich vermute das soll der zeiger auf den string sein?).
-
Ich habs so gemacht:
getStringLen: mov cx, 0 cmp dx, 0 je quitStrlen mov si, dx strlenLoop: cmp byte [si], 24h ; delimiter jz quitStrlen inc si inc cx jnz strlenLoop quitStrlen: ret
Bin aber nicht sicher ob das die beste Lösung ist.
Ist für fasm unter Windows von mir geschrieben worden.
-
Wie muss ich des dann auf 32-bit und mit Parameter umschreiben?
-
flona schrieb:
Wie muss ich des dann auf 32-bit und mit Parameter umschreiben?
FASM kenne ich nicht.
Hier mal ein Inline-Beispiel mit dem starken Stringbefehl "scasb":int StrLen(char* a) { _asm { mov edi, a sub eax, eax lea ecx, [eax-1] repne scasb not ecx lea eax, [ecx-1] } } int main() { char* test = "Hallo!"; int b = StrLen(test); return 0; } MfG
-
thx freak11 es funktioniert
-
flona schrieb:
bzw. kennt ihr eine schnellere Methode?
http://c-plusplus.net/forum/viewtopic-var-p-is-881710.html#881710
-
Jetzt hab ich noch eine Frage: Gibt es schon eine Funktion malloc in ASM also nachprogrammiert als Funktion?
-
Für welches OS denn?
Die Verwaltung des Speichers übernimmt das OS und stellt auch Funktionen
dafür zur verfügung.
-
Für Windows
-
flona schrieb:
Für Windows
Zur Speicherbereichs-Allokierung C:
HGLOBAL GlobalAlloc(UINT uFlags, dwBytes);
Man erhält im Erfolgsfall das Handle (HGLOBAL), aber noch keine Adresse! Diese wird erst durch den Aufruf von GlobalLock geliefert.
Beide API-Funktionen kannst Du in Assembler aufrufen, womit Dein "malloc" in Assembler realisiert wäre.
Zur Speicherfreigabe gibts die API-Funktion GlobalFree.
mfg