To declare a variable that resides at a specified memory address, put the word absolute after the type name, followed by an address. Example:
var CrtMode: Byte absolute $0040;
This technique is useful only in low-level programming, for example when writing device drivers. To create a new variable that resides at the same address as an existing variable, use the name of the existing variable (instead of an address) after the word absolute. For example,
var
Str: string[32]; StrLen: Byte absolute Str;
specifies that the variable StrLen should start at the same address as Str. Since the first byte of a short string contains the string’s length, the value of StrLen is the length of Str. You cannot initialize a variable in an absolute declaration.
Hej borrisholt Jeg har selv været inde og kikke på absolute i online hjælpen men jeg kan ikke se hvordan jeg kan sætte start adressen på det område jeg vil læse fra, som jeg ser det kan man kun bruge absolute hvis den pejer på en anden variabel
hvis jeg prøver dit eksempel
var p : pByteArray absolute $D0000000;
for jeg følgene fejl "Variable name expected" på adressen
Men nej sabine >> Det jeg gø er jeg ligger det jeg finder på Adressen $D0000000 over i eax ...
Lad mig lige komme med et lille eksempel :
Function GetCheckSum (const FileName : TFileName) : Integer; var F : File of Integer; Fsize : Integer; Buffer : Array [0..500] of Integer; begin FileMode := 0; AssignFile ( F , FileName); Reset ( F ); Seek ( F , FileSize ( F ) div 2); Fsize := FileSize( F )-1-FilePos( F ); if Fsize > 500 then Fsize := 500; BlockRead ( F, Buffer, Fsize); CloseFile ( F ); asm xor eax, eax //NULSTILL eax det skal bruges til at tælle sammen i xor ecx, ecx //NULSTILL ecx det skal bruges til at holde vores tælle variabel lea edx , Buffer //Put adressen på Buffer over i edx registeret. @again: //En label vi kan hoppe til PRÆCIS magen til en label i pascal (Ikke at forveksle med TLabel) add eax, [edx + 4*ecx] //En integer fylder 4 BYTE (32 bit) så hvis vi skal have fat i Et eller andet element i vores //Buffer array ligger det på adressen Starten af array + (4*Nummeret på elementet) //Adressen på starten af arrayet ligger i edx registeret. Vores tæller variabel er ecx så //regnestykket hedder edx + 4*ecx. Da vi ikke skal have adressen men der der ligger på adressen //stopper vi det hele ind i []. Det hele bliver stoppet over i eax. inc ecx //tæl ecx op med 1 (inc er en forkortelse af increase) cmp ecx, fsize //sammenlign (cmp er en forkortelse af compare) jl @again //hvis ecx < fsize så goto again lablen vi satte før (jl er en forkortelse af Jump less) mov @result, eax //kom resultater af vores tællen sammen over i result end; end;
Ved nærmer eftertanke når du vil læse et helt fortløbende område vil jeg anbefale dig at gøre sådan her i stedet :
procedure TForm1.Button1Click(Sender: TObject); type ByteArray = array [0..0] of Byte; pByteArray = ^ByteArray; var p : Integer; s : String; i,j : integer; Buffer : pByteArray; begin S := 'Her er en hest'; p := integer(@s[1]); //Eller i dit tilfælde $D0000000 i := Length(s); //Hvor mange bytes skal vi læse
Buffer := pByteArray(p); for j := 0 to i-1 do Memo1.Lines.Add( Char( Buffer[j] ) ); end;
ps. jeg er glad for at jeg kan give dig en lille udfordring i ny og næ
Thomas
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.