Einzelnen Beitrag anzeigen

gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#13

AW: EIntOverflow bei LongWord, nicht aber bei Word

  Alt 28. Mai 2018, 20:03
Für 16-Bit wird der 'falsche' Opcode benutzt (eigentlich der richtige aber wg. der 32-Bit Arithmetik wird in beiden Fällen das Overflow-Bit nicht gesetzt, also netto falscher Code)
Code:
Unit2.pas.38: a := 1000;
005CE68A 66C745FEE803     mov word ptr [ebp-$02],$03e8
Unit2.pas.39: b := 10000;
005CE690 66C745FC1027     mov word ptr [ebp-$04],$2710
Unit2.pas.40: acceptDouble(a-b);
005CE696 0FB745FE        movzx eax,[ebp-$02]
005CE69A 0FB755FC        movzx edx,[ebp-$04]
005CE69E 2BC2             sub eax,edx
005CE6A0 7105             jno $005ce6a7
005CE6A2 E80595E3FF      call @IntOver
Da OF nicht gesetzt ist, gibt's keinen Int-Overflow. Bei 32-Bitwird nicht OF getestet sondern CF, und das ist in beiden Fällen gesetzt.
Code:
Unit2.pas.44: acceptDouble(x-y); // << EIntOverflow
005CE6CA 8B45F8           mov eax,[ebp-$08]
005CE6CD 2B45F4           sub eax,[ebp-$0c]
005CE6D0 7305             jnb $005ce6d7
005CE6D2 E8D594E3FF       call @IntOver
  Mit Zitat antworten Zitat