Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Asm Speicherzuweisung


patrick - Fr 10.12.04 10:35
Titel: Asm Speicherzuweisung
nachdem meine prüfung jetzt vorbei ist, bin ich wieder fleißig am asm programmieren.
allerdings habe ich noch eine sehr grundlegende frage:

kann ich werte einfach so in einen beliebigen speicherbereich abspeichern oder muss ich zuvor einen gewissen speicherbereich in windows reservieren (wovon ich ausgehe).
wenn ja, wie sag ich windows wo mein speicherbereich liegt?


BenBE - Fr 10.12.04 14:42

GetMem \ FreeMem. Diese brauchst du einfach in deiner Prozedur aufrufen und erhälst dann in EAX eine Adresse für diesen Speicherblock.


patrick - Sa 11.12.04 13:11

achso, danke.
und wie groß ist so ein speicherblock?


tommie-lie - Sa 11.12.04 13:18

Deklaration: function _GetMem(Size: Integer): Pointer;;-)


patrick - Sa 11.12.04 15:12

plofff :autsch: :D

zu dem selben thema noch ne erweiterte frage:
wie ist das mit vollständig in asm geschriebenen programmen?
da hat man ja diese nützliche funktion nicht.


I.MacLeod - Sa 11.12.04 15:16

Hi,


Quelltext
1:
2:
3:
4:
5:
push PAGE_READWRITE
push MEM_COMMIT
push Groesse_in_bytes
push 0
call VirtualAlloc


=> EAX: Adresse


Quelltext
1:
2:
3:
4:
push MEM_DECOMMIT
push Groesse_in_bytes
push Adresse
call VirtualFree


Ohne Gewähr :P


tommie-lie - Sa 11.12.04 15:24

Nuja, VirtualAlloc ist nichtmal nötig, die System.pas ist ja so oder so eingebunden, GetMem steht also so oder so zur Verfügung (vorausgesetzt du benutzt den Delphi-Inline-Assembler ;-)). Daher kannst du GetMem wie jede andere stdcall-Funktion auch aufrufen: Größe in EAX, Call, Pointer befindet sich anschließend in EAX ;-)
Nur ob der Funktionsname im Assembler GetMem oder _GetMem heißt, weiß ich nicht, denn ich weiß nicht, wie CompilerMagic in Assembler-Blöcken eingreift. Das kann man aber einfach mal ausprobieren ;-)


patrick - Sa 11.12.04 21:42

@tommie-lie: nein, ich wollte eigendlich auch mal entfernt von delphi etwas asm programmieren 8)


tommie-lie - Sa 11.12.04 21:52

Tja, dann müsstest du dir Header für die Windows-Funktionen besorgen, die dein Assembler versteht (Win32-Assembler), dann gibt's VirtualAlloc und VirtualAllocEx für sowas, und wie das geht, hat I.MacLeod schon geschrieben.


raziel - Sa 11.12.04 22:23

Header Datei für Win32 für den NetwideAssembler (NASM [http://nasm.sf.net]) gibt es hier [http://rs1.szif.hu/~tomcat/win32/] (win32.inc). Außerdem brauchst Du noch die .lib für Deinen Linker. Für ALink [http://www.dreamsight.i12.com/alink.htm] z.B. kannst Du hier [http://www.dreamsight.i12.com/alink.htm] eine Lib runterladen (win32.lib).

Gruß
raziel


patrick - So 12.12.04 23:33

danke für eure antworten.
das beantwortet weitestgehend meine fragen. :P