/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
asm loop i delphi
Fra : david


Dato : 16-01-02 16:40

Hej alle, er der nogen der ved hvordan man laver loop i asm i delphi?
Jeg har følgende kode, der skal ta tid på hvor lang tid der går når man
laver X antal sqrt i 3dnow i asm, men hvordan laver jeg det så det kører
rent asm i loopet.?
time0 := GetTickcount;
now:=100;
now2:=100000;
asm
femms
movd mm0, [now]
movd mm1, [now2]
end;
FOR I:=1 TO 1000000000 DO
begin
asm
PFRSQRT mm0,mm1
end;
end;
asm
femms
end;
time1 := GetTickcount;

--
Regards
Jonathan
www.cpuid.dk



 
 
René Jensen (16-01-2002)
Kommentar
Fra : René Jensen


Dato : 16-01-02 22:45

david wrote:
> Hej alle, er der nogen der ved hvordan man laver loop i asm i delphi?

Hvis jeg ikke husker helt galt, sårh skulle følgende assembler kode
virke (det gjorde i hvertfaldt med Turbo Pascal 7.0)...

asm
mov ax, 0 // sæt start værdi
@loop: // label
add ax, 1 // (add) læg en til værdien som ligger i ax
cmp ax, 1000 // (compare) sammenlign ax med 1000
jne @loop // (jump if not equal) hop til label'en @loop
end;

I ovenstående kode svare ax-registreret til dit I (integer) værdi i
for-løkken. Det kan godt være at du har problemer med at få implementere
en integer værdi ind i assembler, da jeg ikke er sikker på om Delphi
håndtere ax-registreret som 32-bit, da det oprindeligt var 16-bit.

--
Med venlig hilsen,
René Jensen

Once a upon a time a wise man said to me:
"I consider Windows like I consider bad weather ... I accept it and hope
for something better"

david (16-01-2002)
Kommentar
Fra : david


Dato : 16-01-02 22:58

Tak, jeg tror det virker, skal lige lege lidt med det.

--
Regards
Jonathan
www.cpuid.dk
"René Jensen" <rene.jensen@adslhome.dk> wrote in message
news:3C45F457.7BC5DD4D@adslhome.dk...
> david wrote:
> > Hej alle, er der nogen der ved hvordan man laver loop i asm i delphi?
>
> Hvis jeg ikke husker helt galt, sårh skulle følgende assembler kode
> virke (det gjorde i hvertfaldt med Turbo Pascal 7.0)...
>
> asm
> mov ax, 0 // sæt start værdi
> @loop: // label
> add ax, 1 // (add) læg en til værdien som ligger i ax
> cmp ax, 1000 // (compare) sammenlign ax med 1000
> jne @loop // (jump if not equal) hop til label'en @loop
> end;
>
> I ovenstående kode svare ax-registreret til dit I (integer) værdi i
> for-løkken. Det kan godt være at du har problemer med at få implementere
> en integer værdi ind i assembler, da jeg ikke er sikker på om Delphi
> håndtere ax-registreret som 32-bit, da det oprindeligt var 16-bit.
>
> --
> Med venlig hilsen,
> René Jensen
>
> Once a upon a time a wise man said to me:
> "I consider Windows like I consider bad weather ... I accept it and hope
> for something better"



Ingolf (17-01-2002)
Kommentar
Fra : Ingolf


Dato : 17-01-02 11:09

32-bit AX register er EAX


"René Jensen" <rene.jensen@adslhome.dk> wrote in message
news:3C45F457.7BC5DD4D@adslhome.dk...
> david wrote:
> > Hej alle, er der nogen der ved hvordan man laver loop i asm i delphi?
>
> Hvis jeg ikke husker helt galt, sårh skulle følgende assembler kode
> virke (det gjorde i hvertfaldt med Turbo Pascal 7.0)...
>
> asm
> mov ax, 0 // sæt start værdi
> @loop: // label
> add ax, 1 // (add) læg en til værdien som ligger i ax
> cmp ax, 1000 // (compare) sammenlign ax med 1000
> jne @loop // (jump if not equal) hop til label'en @loop
> end;
>
> I ovenstående kode svare ax-registreret til dit I (integer) værdi i
> for-løkken. Det kan godt være at du har problemer med at få implementere
> en integer værdi ind i assembler, da jeg ikke er sikker på om Delphi
> håndtere ax-registreret som 32-bit, da det oprindeligt var 16-bit.
>
> --
> Med venlig hilsen,
> René Jensen
>
> Once a upon a time a wise man said to me:
> "I consider Windows like I consider bad weather ... I accept it and hope
> for something better"



Casper A. Hansen (22-01-2002)
Kommentar
Fra : Casper A. Hansen


Dato : 22-01-02 09:47

"david" <jonamars@hotmail.com> wrote in message news:<a246rj$2grj$1@news.cybercity.dk>...
> Hej alle, er der nogen der ved hvordan man laver loop i asm i delphi?
> Jeg har følgende kode, der skal ta tid på hvor lang tid der går når man
> laver X antal sqrt i 3dnow i asm, men hvordan laver jeg det så det kører
> rent asm i loopet.?
> time0 := GetTickcount;
> now:=100;
> now2:=100000;
> asm
> femms
> movd mm0, [now]
> movd mm1, [now2]
> end;
> FOR I:=1 TO 1000000000 DO
> begin
> asm
> PFRSQRT mm0,mm1
> end;
> end;
> asm
> femms
> end;
> time1 := GetTickcount;

Det er nemmest at tælle ned.
asm
femms // Din egen kode.
movd mm0, [now] // -
movd mm1, [now2] // -
mov eax, 1000000000 // Kør loopen 1 mia gange.
@Loop:
pfrsqrt mm0, mm1 // Din egen kode.
dec eax // Tælle en ned.
jnz @Loop // Hop tilbage sålænge eax er forskellig fra 0
femms // Din egen kode.
end;

Kik på internettet efter assembler 80x86 for nærmere beskrivelse af
instruktionerne.

Bemærk at GetTickCount er meget unøjagtig, idet den kun har en
opløsning på ca. 10 ms.
Brug hellere QueryPerformanceCounter og QueryPerformanceFrequence, så
behøver du ikke lave en loop på en mia, men kan nøjes med en på
10000-100000.

/Casper

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste