Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Sleep per ASM?


Sascha999999999 - So 28.10.07 00:31
Titel: Sleep per ASM?
ist es igendwie möglich per Assembly die Sleep funktion aufzurufen?

also sowohl per API call also auch alles andere was genau und nicht zu lage dauert, also möglichst kein ist, fände ich toll.

Danke.

mfg
Sascha999999999


Delete - So 28.10.07 09:36


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Delay(seconds: Longint);
var
  WaitSecs: DWORD;
  FirstTickCount: DWORD;
begin
  WaitSecs := seconds * 1000;
  FirstTickCount := GetTickCount;
  repeat
    Application.ProcessMessages;
  until ((FirstTickCount > GetTickCount) or
    ((GetTickCount - FirstTickCount) >= WaitSecs));
end;


BenBE - So 28.10.07 10:09

@hathor: Was soll das mit ASM zu tun haben? Bitte Frage lesen ...

Jep. Die Möglichkeit gibt es:


Delphi-Quelltext
1:
2:
3:
4:
asm
    PUSH 1024 //Anzahl Millisekunden
    CALL Sleep
end;


Delete - So 28.10.07 11:10

user profile iconBenBE hat folgendes geschrieben:
@hathor: Was soll das mit ASM zu tun haben? Bitte Frage lesen ...


...also auch alles andere was genau und nicht zu lage dauert, also möglichst klein ist, fände ich toll.

Anderes Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
procedure delay(dwMilliseconds: longint);external 'kernel32.dll' name 'Sleep';

Aufruf:
 delay(1);



@BenBE:

Bitte Frage lesen ...Bitte Frage lesen ...Bitte Frage lesen ...Bitte Frage lesen ...Bitte Frage lesen ...


delfiphan - So 28.10.07 11:16

Bevor du auf die Idee kommst, den Assemblercode in dein Delphi-Programm einzubauen.

Zwischen

Delphi-Quelltext
1:
Sleep(1024);                    

und

Delphi-Quelltext
1:
2:
3:
4:
asm  
    PUSH 1024 //Anzahl Millisekunden  
    CALL Sleep  
end;


besteht kein Unterschied.


Sascha999999999 - So 28.10.07 13:29


Delphi-Quelltext
1:
2:
3:
4:
asm    
    PUSH 1024 //Anzahl Millisekunden    
    CALL Sleep    
end;


ist gut, nur geht es um einen call außerhalb der anwendung, muss ich dann nicht erst Sleep definieren?


Sascha999999999 - So 28.10.07 14:00

BenBE, hatte die Lösung.

mit QueryPerformanceFrequency die fRDTSC auslesen und dann mit:


Quelltext
1:
Millissekunden * fRDTSC / 1000                    


die wartetackte ausrechnen die man dann mit:

Delphi-Quelltext
1:
2:
3:
4:
asm
@@:
loop @@
end;

laufen lassen kann.

Gruß und dank an BenBE
Sascha


delfiphan - So 28.10.07 14:16

Ist wohl etwas Energieverschwendung (volle Prozessauslastung durch Polling), aber das geht natürlich auch.


dummzeuch - So 28.10.07 17:09

user profile icondelfiphan hat folgendes geschrieben:
Ist wohl etwas Energieverschwendung (volle Prozessauslastung durch Polling), aber das geht natürlich auch.


Nicht nur Energieverschwendung: Andere Programme bekommen voellig unnoetig Rechenzeit entzogen. Und spaeter wundern sich die User dann, weshalb ihr Videoschnitt Block-Artefakte liefert, weil der Decompressor nicht genuegend Prozessorzeit bekommt....


Sascha999999999 - So 28.10.07 19:26

naja, es geht ja auchnicht um ring3, ich blocke erst alle Interrupts.