Autor |
Beitrag |
suga2001
      
Beiträge: 38
|
Verfasst: Mo 28.04.08 10:34
hallo... und zwar soll ich einen farbverlauf machen. bisher hat auch alles ziemlich gut ( mit kleinen problemchen, die ich aber schon behoben habe) hingehauen. nun soll ich einen farbverlauf mit einer asm-routine machen, der sich von gelb(links unten) nach rot(rechts oben) zieht. ich habe bisschen mit den zahlen gespielt, um zu sehen,was überhaupt passiert, aber da fängt das problem schon an. linke seite bleibt schwarz und läuft zuu rechte seite rot über.... nix von gelb zu sehen, selbst wenn ich die zahl von 8 auf 16 verschiebe...gleiches resultat. ich habe alle buttonclicks überprüft, alle proceduren und funktionen, aber keinen fehler gefunden.....
wer könnte mir bitte unter die arme greifen? danke im voraus
hier mein quellcode für die function:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| function Farbverlauf3(gelb,rot:integer):TColor;
begin ASM push ecx mov ecx,eax; CMP ecx,edx; JG @warm
@kalt: MOV ECX, EAX SUB EAX, EDX JMP @ende
@warm: SUB EDX, EAX SHL EDX,16 MOV EAX, EDX
@ende: mov EAX,ECX ADD AL,AH pop ECX
END; end; |
Moderiert von Klabautermann: Size- durch Delphi-Tags ersetzt.
Moderiert von Christian S.: Titel geändert, 20(!) Ausrufezeichen entfernt
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 28.04.08 11:22
@CS: 20 oder 20! Ausrufezeichen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function Farbverlauf3(gelb,rot:integer):TColor; ASM mov ecx,eax CMP ecx,edx JG @warm
@kalt: MOV ECX, EAX SUB EAX, EDX JMP @ende
@warm: SUB EDX, EAX SHL EDX,16 MOV EAX, EDX
@ende: mov EAX,ECX ADD AL,AH end; |
Kurz paar Allgemeine Hinweise:
Wenn Du rein ASM haben willst, dann kein Begin-End verwenden; sonst hast Du nämlich noch einige Nebeneffekte des Delphi-Compilers zu beachten
Argumente werden der Reihe nach in EAX, EDX, ECX (von links nach rechts, der Rest auf'm Stack; bei Register) übergeben.
Bitte auch mal beschreiben, wie der Aufruf dieser Routine aussieht!
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
suga2001 
      
Beiträge: 38
|
Verfasst: Mo 28.04.08 18:50
@warm: //Was soll das machen??? wir haben dazu nen skript bekommen wo der prof anhand von 0 bis 255 warm und kalt angibt. in dem fall ist @warm der name der schleife.
ADD AL,AH //Was soll diese Zeile machen??? das weiß ich auch nicht so genau, ich hab gedachte,dass damit irgendein zwischenwert angesprochen wird, damit ich gelb bekomme und kein blau  ????
für den buttonklick der die procedure, bzw den farbverlauf ausführen soll
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Image10Click(Sender: TObject); var x,y ,Anfangszeit,Endzeit:integer; begin Anfangszeit:=GetTickCount; for y:=0 to 255 do BEGIN for x:= 0 to 255 do Image2.Canvas.Pixels[x,y]:=Farbverlauf3(x,y); Image2.Update; END; Endzeit:=GetTickCount; Label2.Caption:=Inttostr(Endzeit-Anfangszeit); Label2.Caption:=format('Farbverlauf dauerte %g Millisekunden',[(Endzeit-Anfangszeit)/1]);
end; |
mein prof meinte,dass wenn man in eine asm-routine begin und end zufügt,dass sie denn gesichert ist.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| unction Farbverlauf3(gelb,rot:integer):TColor; ASM push ecx mov ecx,eax; CMP ecx,edx; JG @warm
@kalt: MOV ECX, EAX SUB EAX, EDX JMP @ende
@warm: SUB EDX, EAX SHL EDX,16 MOV EAX, EDX
@ende: mov EAX,ECX ADD AL,AH pop ECX |
hab im anhang mal das genommen, was ich jetzt machen soll. ich hänge nun bei 5.3 fest, weil ich kein gelb machen kann 
Einloggen, um Attachments anzusehen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 28.04.08 19:22
Versuch das mal so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function Farbverlauf3(x,Y: Integer):TColor; asm AND EAX, $FF AND EDX, $FF
MOV ECX, EAX
ADD EAX, EDX SHR EAX, 1
BSWAP EAX ADD EAX, ECX ROL EAX, 8 end; |
HTH
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
suga2001 
      
Beiträge: 38
|
Verfasst: Mo 28.04.08 20:04
habs ausprobiert. rot/grün hatte ich ja schon. aber ich soll irgendwie ein geld erzeugen,welches von der linken ecke unten in schwarz mitte in rot rechte ecke oben übergeht.
mit seinem script bzw der "Anteilung" kann ich nicht wirklich was anfangen...
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 28.04.08 20:55
Naja, vollständig die Lösung verraten wird Dir nicht viel bringen, da dabeider Lerneffekt etwas verloren geht...
Wie erreicht man so einen Farbverlauf:
- Wenn X(Rot) < Y(Gelb): Rot = Gelb
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function Farbverlauf3(x,Y: Integer):TColor; asm AND EAX, $FF AND EDX, $FF
MOV ECX, EAX
ADD EAX, EDX SHR EAX, 1
BSWAP EAX ADD EAX, ECX ROL EAX, 8 end; |
HTH[/quote]
Eigentlich sind nur die drei markierten Zeilen zu ändern ... Halt wie oben beschrieben ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function Farbverlauf3(x,Y: Integer):TColor; asm AND EAX, $FF AND EDX, $FF
CMP EAX, EDX CMOVC EAX, EDX
BSWAP EAX ADD EAX, EDX ROL EAX, 8 end; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|