Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   div-Fehler (https://www.delphipraxis.net/76731-div-fehler.html)

3_of_8 8. Sep 2006 18:46


div-Fehler
 
Morgen.

Ich habe folgenden ASM-Code:

Delphi-Quellcode:
function DivMod(Dividend, Divisor: Cardinal): TDivModResult;
asm
  div edx
  mov [ecx], eax
  mov [ecx+$04], edx
end;
Das gibt einen Integer-Overflow. Und nicht nur das. Immer wenn ich div ausführe und in edx was anderes drinsteht als 0 gibt es das.

Außerdem kann ich in dem Code kein anderes Register verwenden - in eax steht der erste Parameter, ebx darf ich seltsamerweise nciht überschreiben weil sonst alles abschmiert, in ecx steht die Adresse des results und edx geht wegen o.g. Gründen nicht.

Hawkeye219 8. Sep 2006 19:06

Re: div-Fehler
 
Zitat:

Zitat von 3_of_8
Morgen.

Oh, schon wach? :mrgreen:

Bei einer Division mit einem 32-Bit-Divisor wird als Dividend das Doppel-Register EDX:EAX benutzt (klick). In deinem Code sollte also vor der Division EDX gelöscht werden, was aber den Divisor zerstören würde...

Gruß Hawkeye

Flocke 8. Sep 2006 19:07

Re: div-Fehler
 
div benutzt als Dividend einen 64-Bit Operanden aus EDX:EAX - und EDX:EAX / EDX ist immer größer als 32 Bits.

// Hab den roten Kasten einfach mal ignoriert.

3_of_8 8. Sep 2006 19:46

Re: div-Fehler
 
Aaah, verstehe. Wenn ich jetzt div dx machen würde, würde es gehen?

Flocke 8. Sep 2006 19:55

Re: div-Fehler
 
Nein. div dx benutzt dx:ax als Dividenden. Du musst den Divisor erst in ein anderes Register kopieren und dann auf 0 setzen.

3_of_8 8. Sep 2006 19:57

Re: div-Fehler
 
Und wenn ich keins mehr frei hab, muss ich pushen und poppen?

Amateurprofi 8. Sep 2006 22:51

Re: div-Fehler
 
Zitat:

Zitat von 3_of_8
Und wenn ich keins mehr frei hab, muss ich pushen und poppen?

Ja, mußt Du wohl, also z.B. so

Delphi-Quellcode:
function DivMod(Dividend, Divisor: Cardinal): TDivModResult;
asm
   push ecx
   mov ecx, edx
   xor edx, edx
   div ecx
   pop ecx
   mov [ecx], eax
   mov [ecx+$04], edx
end;

Flocke 8. Sep 2006 22:52

Re: div-Fehler
 
Zitat:

Zitat von 3_of_8
Und wenn ich keins mehr frei hab, muss ich pushen und poppen?

Genau - und da eax, edx und ecx schon für die Parameter verwendet werden sind nur noch ebx, esi und edi frei und die müssen gesichert werden. Hier mal eine Variante:
Delphi-Quellcode:
function DivMod(Dividend, Divisor: Cardinal): TDivModResult;
asm
  push edx
  xor edx, edx
  div dword ptr [esp] // das alte EDX
  mov [ecx], eax
  add esp, 4
  mov [ecx+$04], edx
end;
// ROTER KASTEN
Irgendwie bin ich heute zu langsam... :???:

3_of_8 8. Sep 2006 23:10

Re: div-Fehler
 
So ähnlich hatte ich das schon - nur ich hatte einen Befehl mehr.

Seit ich weiß, dass div edx:eax als Dividend nimmt, wenn ich das mit div edx mache, macht das mit dem Integerüberlauf natürlich auch Sinn. Danke @all.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz