Wie alloziert man Dynamischen Speicher?
-
Hallo allerseits,
in C gibt es ja Funktionen wie malloc, calloc, realloc und free. Kann man irgendwie die C Library in Assembler (ich benutzte MASM32) einbinden? Oder gibt es eine andere Möglichkeit Speicher zu allozieren?
Mit freundlichen Grüßen,
Developer30
-
Du kannst entweder die CRT Funktionen benutzen (**crt_**calloc,**crt_**malloc,...) oder die entsprechenden WinAPI Funktionen wie HeapAlloc(), GlobalAlloc(),...
Für dich vieleicht interessant, die Makros halloc() und alloc()include \masm32\include\masm32rt.inc ... mov edi,halloc(123) ; HeapAlloc()
(--> \masm32\help\hlhelp.chm)
-
danke
-
Ich habe versucht halloc anzuwenden, habe jedoch irgendetwas falsch gemacht :(. In folgendem Code erscheint zwar eine Message Box, jedoch ist sie leer (ohne Text, das Icon stimmt aber).
local Text:dword local Zahl:dword mov Text,halloc(5*sizeof(byte)) mov Zahl,halloc(5*sizeof(dword)) mov Text[0],"a" mov Text[1],"b" mov Text[2],"c" mov Text[3],"d" mov Text[4],0 mov Zahl[3],64 invoke MessageBoxA, 0, addr Text, addr Text, Zahl[3] hfree Text hfree Zahl
Wo liegt der Fehler?
-
Assembler ist keine Hochsprache und führt hier daher auch keine Dereferenzierung durch: mit Text[i] überschreibst du den Pointer und nicht die Daten auf die er zeigt. Text[1] entspricht hierbei dem Ausdruck [ebp+N+1], wobei N irgendein negatives vielfache von 4 ist, das von der Position in der Lokalen-Deklaration abhängt. Die Indizes beziehen sich immer auf BYTES.
local Text:dword local Zahl:dword mov Text,halloc(5*sizeof(byte)) mov Zahl,halloc(1*sizeof(dword)) ;... mov esi,Text ; esi = pointer mov edi,Zahl mov CHAR ptr [esi][0],'h' mov CHAR ptr [esi][1],'a' mov CHAR ptr [esi][2],'l' mov CHAR ptr [esi]+3,'l' ;syntax variation mov CHAR ptr [esi+4],'o' ; " " mov CHAR ptr [esi][5],0 ; term. zero mov DWORD ptr [edi],64 invoke MessageBoxA, 0, Text, Text, DWORD ptr [edi] hfree Text hfree Zahl
-
ah ok. Vielen dank, du hast mir sehr weitergeholfen!