Autor Beitrag
white-desert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: 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 :-(

ausblenden 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
  { eax = 0 }
  xor eax, eax

  { al = 240 }
  mov al, 240

  { 240+33 > 255!!! --> overflow???????????? }
  add al, 33

  { wenn overflow dann geh zu overflow }
  jo  @overflow

  { wenn nicht, dann eben nicht :-)  }
  jmp @nooverflow


  @overflow:
    mov eax, 255

  @nooverflow:
    mov eax, 0
end;


was mache ich falsch?
dankeschoen!
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: So 27.01.08 09:57 
user profile iconwhite-desert hat folgendes geschrieben:
.... Aber bei mir gibt diese Funktion immer 0 zurueck, der Code unter @overflow wird nicht ausgefuehrt, NUR der unter @nooverflow :-(

ausblenden 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
  { eax = 0 }
  xor eax, eax

  { al = 240 }
  mov al, 240

  { 240+33 > 255!!! --> overflow???????????? }
  add al, 33

  { wenn overflow dann geh zu overflow }
  jo  @overflow

  { wenn nicht, dann eben nicht :-)  }
  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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function machmal:Integer;
asm
      xor   eax, eax  { eax = 0 }
      mov   al, 240
      add   al, 33
      jo    @overflow
      mov   eax, 0
      jmp   @done
@overflow:
      mov   eax, 255
@done:
end;


Gruss Reinhard
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 27.01.08 18:55 
Geht übrigens auch eleganter ...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function machmal:Integer;
asm
//      xor   eax, eax  { eax = 0 }
      mov   al, 240
      add   al, 33

      setc  al //OVerflow-Flag abfangen (durch Carry repräsentiert)
      neg   al //Vorzeichen (Ones Complement) ändern. (Wenn True\False wie unten vorgeschlagen, entfällt der hier)

      movsx eax, eax //Wenn wirklich Integer benötigt, ansonsten weglassen
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16



BeitragVerfasst: Di 29.01.08 10:14 
user profile iconAllesquarks 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 :-)