Autor |
Beitrag |
white-desert
      
Beiträge: 16
|
Verfasst: So 27.01.08 00:07
Hallo,
komme einfach nicht weiter: Zum 1-Byte register AL wird soviel dazuaddiert, dass ein overflow entsteht (240+33).
Per JO (Springe wenn Overflow Flag gesetzt ist) kann man (soviel ich weiss) zu einem Label springen, wenn das OVERFLOW-Flag gesetzt ist. Aber bei mir gibt diese Funktion immer 0 zurueck, der Code unter @overflow wird nicht ausgefuehrt, NUR der unter @nooverflow
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: 24:
| function machmal:Integer; asm xor eax, eax
mov al, 240
add al, 33
jo @overflow
jmp @nooverflow
@overflow: mov eax, 255
@nooverflow: mov eax, 0 end; |
was mache ich falsch?
dankeschoen!
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: So 27.01.08 01:01
Hm kann es sein, dass overflow nicht das richtige Flag ist. Müsste nachschauen, aber kann es sein, dass das überläufe bei Zahlen mit Vorzeichen angibt. Versuch das ganze doch mal mit dem carry Flag (jc @@...).
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: So 27.01.08 09:57
white-desert hat folgendes geschrieben: | .... Aber bei mir gibt diese Funktion immer 0 zurueck, der Code unter @overflow wird nicht ausgefuehrt, NUR der unter @nooverflow
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: 24:
| function machmal:Integer; asm xor eax, eax
mov al, 240
add al, 33
jo @overflow
jmp @nooverflow
@overflow: mov eax, 255
@nooverflow: mov eax, 0 end; |
was mache ich falsch?
dankeschoen! |
Nach @overflow wird sofort @nooverflow ausgeführt, die Unterscheidung durch Jump ist damit wirkunglos. Es müsste heissen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function machmal:Integer; asm xor eax, eax mov al, 240 add al, 33 jo @overflow mov eax, 0 jmp @done @overflow: mov eax, 255 @done: end; |
Gruss Reinhard
|
|
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: So 27.01.08 18:55
Geht übrigens auch eleganter ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function machmal:Integer; asm mov al, 240 add al, 33
setc al neg al movsx eax, eax end; |
Ach ja: Im Normalfall: Wenn Du Boolean zurückgeben willst, gibt 0 für False und 1 für True zurück. Gibt ansonsten arge Probleme bei einigen Dingen was Delphi optimiert, weil der Compiler bei Array[Boolean] of ... z.B. einfach den Index mit der Größe des Datentyps multipliziert, was zu sehr merkwürdigen Fehlern führt (die auf normale Art und Weise nicht reproduzierbar sind).
_________________ 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.
|
|
white-desert 
      
Beiträge: 16
|
Verfasst: Di 29.01.08 10:14
Allesquarks hat folgendes geschrieben: | Hm kann es sein, dass overflow nicht das richtige Flag ist. Müsste nachschauen, aber kann es sein, dass das überläufe bei Zahlen mit Vorzeichen angibt. Versuch das ganze doch mal mit dem carry Flag (jc @@...). |
Ja. Ich hab ein falsche Flag genommen. Das Carry-Flag gibt in Wirklichkeit den Ueberlauf an.
Danke an alle,
Danke Allesquarks 
|
|
|