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! 🙂


Anmelden zum Antworten