AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

div-Fehler

Ein Thema von 3_of_8 · begonnen am 8. Sep 2006 · letzter Beitrag vom 8. Sep 2006
Antwort Antwort
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#1

div-Fehler

  Alt 8. Sep 2006, 18:46
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: div-Fehler

  Alt 8. Sep 2006, 19:06
Zitat von 3_of_8:
Morgen.
Oh, schon wach?

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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: div-Fehler

  Alt 8. Sep 2006, 19:07
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: div-Fehler

  Alt 8. Sep 2006, 19:46
Aaah, verstehe. Wenn ich jetzt div dx machen würde, würde es gehen?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: div-Fehler

  Alt 8. Sep 2006, 19:55
Nein. div dx benutzt dx:ax als Dividenden. Du musst den Divisor erst in ein anderes Register kopieren und dann auf 0 setzen.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: div-Fehler

  Alt 8. Sep 2006, 19:57
Und wenn ich keins mehr frei hab, muss ich pushen und poppen?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#7

Re: div-Fehler

  Alt 8. Sep 2006, 22:51
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: div-Fehler

  Alt 8. Sep 2006, 22:52
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...
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: div-Fehler

  Alt 8. Sep 2006, 23:10
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 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