| Autor |
Nachricht |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
23:20:55 30.03.2012 Titel: |
Wie alloziert man Dynamischen Speicher? |
Zitieren |
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 |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
23:47:46 30.03.2012 Titel: |
Re: Wie alloziert man Dynamischen Speicher? |
Zitieren |
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()
| Code: | include \masm32\include\masm32rt.inc
...
mov edi,halloc(123) ; HeapAlloc() | |
(--> \masm32\help\hlhelp.chm) |
|
|
|
 |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
00:14:50 31.03.2012 Titel: |
|
Zitieren |
danke |
|
|
|
 |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
18:26:55 31.03.2012 Titel: |
|
Zitieren |
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).
| Assembler: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | 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? |
Zuletzt bearbeitet von Developer30 am 18:28:57 31.03.2012, insgesamt 2-mal bearbeitet |
|
 |
masm
Unregistrierter
|
masm Unregistrierter
19:20:53 31.03.2012 Titel: |
|
Zitieren |
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.
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 | | |
|
|
|
 |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
19:47:50 31.03.2012 Titel: |
|
Zitieren |
ah ok. Vielen dank, du hast mir sehr weitergeholfen! |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|