Avatar billede sabine Nybegynder
03. oktober 2002 - 22:36 Der er 18 kommentarer og
1 løsning

Læs fra ram

Jeg har et PCI komunikation kort som har et hukommelse område fra f.eks. D0000000 til D0000FFF hvor den lægger den data som den modtager

mit problem er at det software der fulgte med kun er til dos.
jeg så gerne kunne læse dette område ind og skrive til det fra delphi

er der nogen der kan give et eksempel på hvordan man gør dette
Avatar billede borrisholt Novice
04. oktober 2002 - 12:40 #1
prøv noget alla det her :

var
  p : pByteArray absolute $D0000000;


fra online hjælpen :

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.

Jens b
Avatar billede sabine Nybegynder
04. oktober 2002 - 17:05 #2
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
Avatar billede borrisholt Novice
05. oktober 2002 - 10:49 #3
du kan jo altid selv gøre det i Assembler :

mov eax, [$D0000000]

Jens B
Avatar billede borrisholt Novice
05. oktober 2002 - 10:50 #4
Ellers så skift til Delphi 5 der må man godt ....

Jeg har lige tested ... Det er en feature de har fjernet i d6 og frem

Jens B
Avatar billede sabine Nybegynder
05. oktober 2002 - 11:27 #5
nu er jeg ikke så god til assembler, og har ikke delphi 5.

det du gør med denne linie er at lægge adressen over i eax
mov eax, [$D0000000]
hvilket registre skal jeg så læse dataen fra.
Avatar billede borrisholt Novice
05. oktober 2002 - 11:40 #6
Send lige dit tlf nummer til Jens@Borrisholt.com så ringer jeg dig lige op så skal jeg forklare dig hvordan der hænger sammen.

Jens B
Avatar billede borrisholt Novice
05. oktober 2002 - 11:44 #7
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;


Jens B
Avatar billede sabine Nybegynder
05. oktober 2002 - 12:42 #8
det var sq godt nok hurtigt Jens

det vil sige at jeg skulle kunne gøre sådan her

function LaesRam(Adresse : cardinal) : cardinal;
begin
result := 0;
asm
  xor eax, eax
  mov eax, [adresse + 4]
  mov @result, eax
end;
end;

eller er jeg helt forkert på den
Avatar billede borrisholt Novice
05. oktober 2002 - 13:02 #9
jaaaee .. Er du sikker på det er unsigned data du har der ude ?

Jens B
Avatar billede sabine Nybegynder
05. oktober 2002 - 13:07 #10
jens du må gerne ringe det er lidt svært at forklare
Avatar billede borrisholt Novice
05. oktober 2002 - 13:12 #11
det kræver et tlf nummer :-)

Jens B
Avatar billede sabine Nybegynder
05. oktober 2002 - 13:22 #12
det er sendt
Avatar billede borrisholt Novice
05. oktober 2002 - 13:25 #13
Sådan her :

type
  pCardinal = ^Cardinal;
{$IFDEF PUREPASCAL}
  pInteger = ^Integer;
  pByte    = ^Byte;
{$ENDIF}

function ReadInteger(Adresse : Integer) : Integer;
{$IFDEF PUREPASCAL}
  Result := pInteger(Adresse)^
{$ELSE}
asm
  mov eax , [Eax]
{$ENDIF}
end;

function ReadCardinal(Adresse : Integer) : Cardinal;
{$IFDEF PUREPASCAL}
  Result := pCardinal(Adresse)^
{$ELSE}
asm
  mov eax , [Eax]
{$ENDIF}
end;

function ReadByte(Adresse : Integer) : Byte;
{$IFDEF PUREPASCAL}
  Result := pByte(Adresse)^
{$ELSE}
asm
  mov al , [Eax]
{$ENDIF}
end;
Avatar billede borrisholt Novice
05. oktober 2002 - 13:46 #14
her er lidt mere :

type
  pCardinal = ^Cardinal;
{$IFDEF PUREPASCAL}
  pInteger = ^Integer;
  pByte    = ^Byte;
{$ENDIF}

function ReadInteger(Adresse : Integer) : Integer;
{$IFDEF PUREPASCAL}
  Result := pInteger(Adresse)^
{$ELSE}
asm
  mov eax , [Eax]
{$ENDIF}
end;

function ReadCardinal(Adresse : Integer) : Cardinal;
{$IFDEF PUREPASCAL}
  Result := pCardinal(Adresse)^
{$ELSE}
asm
  mov eax , [Eax]
{$ENDIF}
end;

function ReadByte(Adresse : Integer) : Byte;
{$IFDEF PUREPASCAL}
  Result := pByte(Adresse)^
{$ELSE}
asm
  mov al , [Eax]
{$ENDIF}
end;

function ReadChar(Adresse : Integer) : Char;
{$IFDEF PUREPASCAL}
  Result := pChar(Adresse)^
{$ELSE}
asm
  mov al , [Eax]
{$ENDIF}
end;

procedure TForm1.Button1Click(Sender: TObject);
type
  IntArray = array [0..0] of Integer;
  pIntArray = ^IntArray;
var
  p : Integer;
  s : String;
  i,j : integer;
  Buffer : pIntArray;
begin
  GetMem(Buffer, 10 * 4); //10 Integers af 4 bytes pr stk

  for i := 0 to 9 do
    Buffer[i] := i;

  p := integer(Buffer);

  for i := 0 to 9 do
  begin
    Memo1.Lines.Add( IntToStr( ReadInteger(p) )  );
    inc(p, 4); //4 Bytes;
  end;

  S := 'Her er en hest';
  p := integer(@s[1]);
  i := Length(s);

  for j := 0 to i-1 do
  begin
    Memo1.Lines.Add( ReadChar(p) );
    inc(p); //1 Byte;
  end;
end;


Jens B
Avatar billede borrisholt Novice
05. oktober 2002 - 14:04 #15
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;


Jens B
Avatar billede sabine Nybegynder
05. oktober 2002 - 23:53 #16
Jeg siger mange tak for din hjælp jens
Avatar billede borrisholt Novice
06. oktober 2002 - 12:28 #17
Jammen selv tak da .. Det er altid spændende når du spørger om noget, fordi som regl kender jeg ikke svaret ....

Jeg håber du får det til at virke på arbejde i morgen :-)

God søndag.

Jens B
Avatar billede sabine Nybegynder
08. oktober 2002 - 19:36 #18
lige en update jens, det virker findt, så nu er der en testafdeling der bliv glade når resten er færdig

Mvh
Thomas
Avatar billede sabine Nybegynder
08. oktober 2002 - 19:38 #19
ps. jeg er glad for at jeg kan give dig en lille udfordring i ny og næ

Thomas
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester