dword dezimal ausgeben

Diskussion zum Thema Programmierung unter DOS (Intel x86)
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: dword dezimal ausgeben

Beitrag von freecrac »

Dosenware hat geschrieben:
freecrac hat geschrieben: Das kann man bei Bedarf ja softwareseitig tun. Es gibt aber keine besondere Notwendigkeit so etwas hardwareseitig abzufangen. Denn sonst könnte vergleichsweise ja auch bei jedem add-Befehl wo eine Null addiert wird zu einem "Add with Zero--Error Exception" führen
x+0=x
x/0=undefiniert
Wieso eigentlich undefiniert: Wert des Dividenden geteilt duch Null = Wert des Dividenden bleibt ungeteilt erhalten!
Da ist der Unterschied,
Der Unterschied besteht nur darin, dass ein Ergebniss bei der Divison durch Null nicht in den Zielregistern landet und stattdessen ein sinnloser Exception ausgelöst wird, anstelle das man den ungeteilten Wert einfach in die Zielregister einträgt, denn der Dividend der duch null geteilt wurde bleibt sonst ja einfach nur ungeteilt erhalten und könnte als Ergebniss doch ebenfalls verwendet werden, gäbe es nicht diesen völlig sinnlossen Divide by Zero-Error-Exception.
warum das /0 Hardwareseitig abgefangen wird hat wohl etwas mit der Entwicklungsgeschichte der Prozessoren zu tun,
Diese Begründung ist mir zu schwammig. Auch kann ich es mir nicht vorstellen das es schaltungstechnisch so viel aufwendiger sein würde, das Ergebniss einer Divison durch Null einfach in die dafür vorgesehenen Zielregister zu packen und auf eine Exception zu verzichten.
aber ein x+0 muss nun wirklich nicht abgefangen werden.
Ich sehe auch keinen Sinn darin ein x/0 hardwareseitig abzufangen.
BTW. bei der Schleife macht der K6 übrigens

Code: Alles auswählen

1{mov bx}+FFFF{mov cx}+(2*FFFF*FFFF{innere Schleife})+FFFF{dec bx}+FFFF{jnz}/ 8,60s= 8.589.869.056/ 8,60= 998.8 Millionen Befehle/s mit Loop
1{mov bx}+FFFF{mov cx}+(3*FFFF*FFFF{innere Schleife})+FFFF{dec bx}+FFFF{jnz}/17,15s=12.884.705.281/17,15= 751.3 Millionen Befehle/s ohne Loop
Bei 500MHz nicht übel...mal schauen ob da ein Rechenfehler drin ist
Für Prozessoren einer bestimmten Baureihe kann das Ergebniss im Vergleich zu anderen Prozessoren schon mal unterschiedlich ausfallen.
Doch bei sehr vielen Prozessoren ist ein Loop in der Regel eher langsamer als eine Kombination aus "dec Register + jnz Adresse".
Man könnte aber auch nachschauen um welche CPU es sich handelt und dann für spezzielle CPUs eine Alternativ-Routine bereitstellen.

Dirk
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: dword dezimal ausgeben

Beitrag von Dosenware »

Wieso eigentlich undefiniert: Wert des Dividenden geteilt duch Null = Wert des Dividenden bleibt ungeteilt erhalten!
weil x/0 gegen unendlich geht und das ist kein definierter Zahlenwert, der Registerinhalt wäre also in jedem Fall fehlerhaft (deshalb vmt. auch die Exeption als Signal: "hier ist ein Fehler passiert")

und anders Argumentiert:
Die Division ist die umkehrfunktion der Multiplikation, da aber x*0=0 ist (wobei x ein beliebiger wert sein kann) gibt es bei der Division/0 kein eindeutiges Ergebnis (sondern die gesamtmenge der realen Zahlen passt)

und nochmal anders argumentiert:
Multiplikation und Division basieren auf Addition und Subtraktion.

bei der Multiplikation bedeutet die Gleichung x*y=z
z=0
for i=1 to y do z=z+x
Ausgabe z

bei der Division bedeutet die Gleichung x/y=z
z=0
solange x>=y
(
z++
x=x-y
)
Ausgabe z
Ausgabe x (Rest)

-> Wenn y=0 ist wird die Abbruchbedingung der Schleife nie erreicht
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: dword dezimal ausgeben

Beitrag von oDOSseus »

Ich muss Dosenware zustimmen.

1. DIV ist ein Mathematischer Befehl.
In der Mathematik ist x/0 eben nicht x. x/0 ist nicht definiert und somit hat es kein Ergebnis.
2. Kein Programm will durch Null teilen.
Es gibt keine Situation in der es Sinnvoll ist einen Wert durch Null zu teilen. Wenn man doch durch Null teilt, dann macht das Programm gerade etwas unsinniges, ohne es zu wissen. Wenn das der Fall ist, sind die Daten korrupt. Wenn die Daten korrupt sind, ist das Ergebnis sowieso für den Müll. Das sollte das Programm erfahren.
3. x/0 = x setzen hilft Niemandem.
Wenn du x/0 immer gleich X setzt, dann kann es sein, dass du endlos-Schleifen erhältst, falls du das ergebnis der division abfragst und sichergehst, dass du nicht durch 1 teilst.

Es gibt einfach viele Gründe für eine Exception und keinen Grund gegen eine Exception
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: dword dezimal ausgeben

Beitrag von freecrac »

Dosenware hat geschrieben:
Wieso eigentlich undefiniert: Wert des Dividenden geteilt duch Null = Wert des Dividenden bleibt ungeteilt erhalten!
weil x/0 gegen unendlich geht und das ist kein definierter Zahlenwert, der Registerinhalt wäre also in jedem Fall fehlerhaft (deshalb vmt. auch die Exeption als Signal: "hier ist ein Fehler passiert")

und anders Argumentiert:
Die Division ist die umkehrfunktion der Multiplikation, da aber x*0=0 ist (wobei x ein beliebiger wert sein kann) gibt es bei der Division/0 kein eindeutiges Ergebnis (sondern die gesamtmenge der realen Zahlen passt)

und nochmal anders argumentiert:
Multiplikation und Division basieren auf Addition und Subtraktion.

bei der Multiplikation bedeutet die Gleichung x*y=z
z=0
for i=1 to y do z=z+x
Ausgabe z

bei der Division bedeutet die Gleichung x/y=z
z=0
solange x>=y
(
z++
x=x-y
)
Ausgabe z
Ausgabe x (Rest)

-> Wenn y=0 ist wird die Abbruchbedingung der Schleife nie erreicht
Dann plaziere doch dort eine solche Abbruchbedingung.
else wenn Y=0 dann Z = X

Dirk
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: dword dezimal ausgeben

Beitrag von freecrac »

oDOSseus hat geschrieben:Ich muss Dosenware zustimmen.

1. DIV ist ein Mathematischer Befehl.
Hier muss ich widersprechen, es ist ein Rechenbefehl und Mathemati hat nur sehr wenig mit dem Rechnen zu tun.
In der Mathematik ist x/0 eben nicht x. x/0 ist nicht definiert und somit hat es kein Ergebnis.
Die Mathematik brauchen wir beim Rechnen in diesem Fall aber nicht.
2. Kein Programm will durch Null teilen.
Es kann schon mal vorkommen das ein Divisor Null ist und ich kenne gar keinen praktischen Grund warum in diesem Fall nicht einfach Der Dividend in die Ergebnisregister eingetragen wird.
Ob bei der Mathematik hierbei eine Wert als undefiert angesehen wurde ist doch hierbei belanglos bei unseren Wunch das der Dividend in die Zielregister eingetragen gehört, um damit ein sinnvolles Ergebnisszu zu erzielen.
Wir brauchen hierbei keine pragmatische Vorgehensweise aus der Mathematik, sondern eine praktische Vorgehensweise die bei einer Division durch Null den Dividend in die Zielregister einträgt.
Es gibt keine Situation in der es Sinnvoll ist einen Wert durch Null zu teilen.
Es ist aber sinnvoll falls ein Divisor doch mal Null ist, das dann die Berechnungen weiter fortgesetzt werden können und es dewegen nicht zu einem Abbruch kommt. Und hierbei geht es nicht darum ob aus mathematischer Sicht ein solches Ergebniss als undefiniert gilt, sondern es geht darum in diesem Fall eine praktische Rechenlösung zu finden die keinerlei Problem aufwirft.
Wenn man doch durch Null teilt, dann macht das Programm gerade etwas unsinniges, ohne es zu wissen. Wenn das der Fall ist, sind die Daten korrupt. Wenn die Daten korrupt sind, ist das Ergebnis sowieso für den Müll. Das sollte das Programm erfahren.
Wieso sollen die Daten deswegen koruppt sein?

Wenn ein Wert bei ener Divion durch Null nicht geteilt wird, dann bleibt er als ganzes erhalten und kann ebenso weiter verarbeitet werden wie auch Teile davon, wenn der Wert aufgeteilt wurde. So kann es durchaus Sinn machen den Wert auch ungeteilt als Ganzes zu verwenden. Beispielsweise als Adresse am Anfang einer Adress-Tabelle , wo die nachfolgenden Adresss-Einträge nur Teile der vorherigen Anfangsadresse sind. Solche Beispiele lassen sich belibig fortführen, so dass es jede Menge Anwendungsszenarien gibt wo so etwas nützlich sein könnte bei einer Division durch Null den Dividend als Ergebniss einzutragen.
3. x/0 = x setzen hilft Niemandem.
Wenn du x/0 immer gleich X setzt, dann kann es sein, dass du endlos-Schleifen erhältst, falls du das ergebnis der division abfragst und sichergehst, dass du nicht durch 1 teilst.
So eine Endlosschleife läßt sich mit einfachen Mitteln verhindern.
Es gibt einfach viele Gründe für eine Exception und keinen Grund gegen eine Exception
Ich kenne keinen einzigen praktischen Grund für eine Exception und ich konnte schon einen Grund aufzeigen warum so ein Exception keinen Sinn macht.

Dirk
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: dword dezimal ausgeben

Beitrag von oDOSseus »

Du kannst doch nicht einfach behaupten es sei sinnvoll durch Null zu teilen, wenn es mathematisch gar nciht möglich ist.
Gib mir ein Code-Beispiel, bei dem die Daten nicht korrupt sind und wo durch Null teilen Sinn macht.

Abgesehen Davon ist x/0!=x. Wenn wir das ändern können wir auch gleich sagen x/10 ist fast x/9 also teilen wir ab jetzt immer durch 10 statt durch neun.
Außerdem ist es mathematisch falsch, wenn x/0=x und x/1=x dann müssen ja 0=1 sein.
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: dword dezimal ausgeben

Beitrag von Dosenware »

Dann plaziere doch dort eine solche Abbruchbedingung.
Das wäre dann die exception, alles andere wäre nicht korrekt: Denn gerechnet wird nach den Regeln der Mathematik.
Es geht nicht darum dass es schwer wäre in einem solchen Fall einfach irgendeinen Wert auszugeben, sondern darum das Division durch 0 nicht zulässig ist und ein undefiniertes Ergebnis zurückliefert.

Es gibt Rechenregeln und wenn man rechnet hat man sich an diese Regeln zu halten.Punkt.
Andernfalls könnte ich auch einfach 1+1=3 definieren.

Korrupt sind die Daten in jedem Fall da, egal welcher Wert in den Registern steht, sie nicht den Rechenregeln entsprechen.
Die Mathematik brauchen wir beim Rechnen in diesem Fall aber nicht.
Und woher weist du dann wie die Division funktioniert? Durch Physik?
Es ist aber sinnvoll falls ein Divisor doch mal Null ist, das dann die Berechnungen weiter fortgesetzt werden können und es dewegen nicht zu einem Abbruch kommt.
Und wo ist da das Problem mit der exception? Ist doch letzlich auch nur ein Irq... und wozu eigentlich die Berechnungen fortsetzen? Da kommt doch eh kein korrektes Ergebnis heraus. Und falls es mal einen Sonderfall gibt kann man den auch Recht leicht implementieren...
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: dword dezimal ausgeben

Beitrag von freecrac »

oDOSseus hat geschrieben:Du kannst doch nicht einfach behaupten es sei sinnvoll durch Null zu teilen, wenn es mathematisch gar nciht möglich ist.
Würde bei einem Div-Befehl durch null der Dividend in die Zielregister eingetragen werden und kein Exception ausgelöst werden, dann könnte es Sinn machen.
Wie es in der Mathematik gemacht wird daran brauchen wir uns doch in diesem besonderen Fall gar nicht zu orientieren.
Gib mir ein Code-Beispiel, bei dem die Daten nicht korrupt sind und wo durch Null teilen Sinn macht.
Wenn du mir eine x86-CPU geben kannst, welche wie oben beschrieben bei einem DIV-Befehl durch Null den Dividend in die Zielregister schreibt, dann kann ich dir für diese CPU auch ein Codebespiel schreiben womit man das Ergebniss aus dieser Berechnung sinnvoll verwenden kann. Man könnte z.B. Adressen berechnen bei dem der Divisor auch mal Null sein darf, ohne das die Berechnung deswegen abgebrochen wird.

Was würde dich eigentlich daran jetzt genau stören, wenn sich unsere CPU wie ich es beschrieben habe anders verhalten würde?
Abgesehen Davon ist x/0!=x.
Genau das soll sich ja ändern bei unseren x86-CPUs, so das x/0=x wird.
Wenn wir das ändern können wir auch gleich sagen x/10 ist fast x/9 also teilen wir ab jetzt immer durch 10 statt durch neun.
Können kann man Vieles und wenn du auch noch einen Grund dafür benennen kannst warum wir das machen wollen, dann könnte man mal darüber nachdenken, was für einen Sinn es machen könnte.
Doch mir geht es hierbei jetzt nur um ein Div-Befehl geteilt durch Null. Über andere Themen können wir gerne aber auch reden, falls du ein weiterführendes Interesse daran hast.
Außerdem ist es mathematisch falsch, wenn x/0=x und x/1=x dann müssen ja 0=1 sein.
Es genügt mir wenn x/0=x wird und x/1=x bleibt. Ich denke nicht das dieser Sonderfall noch andere Änderungen benötigt.

Dirk
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: dword dezimal ausgeben

Beitrag von oDOSseus »

Wann teilst du durch null-Adressen???

Folgende nicht abweisbare Gründe gibt es für die Exception:

1. Es ist die einzige richtige Lösung der Rechnung: Nämlich keine Lösung
2. Der Programmierer erfährt so, ob er gerade Murks macht, denn es ist Murks wenn man durch Null teilt
3. Der Programmierer kann die Exception auch so einstellen, dass einfach nichts geschieht.
4. Da das Ergebnis undefiniert ist, müsste ein neuer Industriestandard geschaffen werden, an den sich alle halten
5. In der Mehrzahl der Fälle, wo man durch Null teilt, ist dies nicht erwünscht.

Ich gehe fest Davon aus, dass in den Fällen, in denen du durch Null teilst eig. nur einen gewissen Fall (Adresse gleich null) nicht abfangen willst, der eig. nicht durch eine division lösbar ist, den du aber trotzdem durchlaufen willst, um Code zu sparen. Dein Algorithmus (der wahrscheinlich noch sehr rahr ist) ist aber kein Argument für eine Änderung weg von der Div-0-Exception.

Außerdem entsteht ab und zu ein Überlauf bei einer divsion durch null. Um den abzufangen, müsste die CPU also sowieso vor jeder divison die Register auf Null prüfen. Das ist aber deine Aufgabe. Bei meinem alten DOS PC war es so, das CIV1 immer durch null teilte, wenn die CPU zu schnell war. Das ging nur 1 mal gut. beim 2. mal stürzte das OS dann ganz ab, da der Überlauf dieses korumpierte.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: dword dezimal ausgeben

Beitrag von freecrac »

Dosenware hat geschrieben:
Dann plaziere doch dort eine solche Abbruchbedingung.
Das wäre dann die exception, alles andere wäre nicht korrekt: Denn gerechnet wird nach den Regeln der Mathematik.
Es geht nicht darum dass es schwer wäre in einem solchen Fall einfach irgendeinen Wert auszugeben, sondern darum das Division durch 0 nicht zulässig ist und ein undefiniertes Ergebnis zurückliefert.

Es gibt Rechenregeln und wenn man rechnet hat man sich an diese Regeln zu halten.Punkt.
Nö, ich bin nicht Weisungsgebunden. Wir dürfen hier alles was wir gelernt haben auch wieder vergessen und jederzeit eigene Regeln aufstellen, so lange und so oft es uns Spaß macht.

Und was genau würde dich denn daran stören, wenn unsere x86-CPUs bei einen Div-Befehl geteilt durch Null den Dividend in die Zielregister eintragt und kein Exception ausgelöst wird?
Andernfalls könnte ich auch einfach 1+1=3 definieren.

Korrupt sind die Daten in jedem Fall da, egal welcher Wert in den Registern steht, sie nicht den Rechenregeln entsprechen.
Glaubst du das würde mich davon abhalten können eigene Regeln für mich und für Gleichgesinnte aufzustellen?
Die Mathematik brauchen wir beim Rechnen in diesem Fall aber nicht.
Und woher weist du dann wie die Division funktioniert? Durch Physik?
Mit der Schaltungstechnik kenne ich mich nicht aus. Gibt es damit Probleme?

Programmtechnisch wünsche ich mir das beim DIV-Befehl geteilt durch Null der Dividend in die Zielregister geschrieben wird. Mir doch egal ob es anderswo fern jeder Programmierung keinen Sinn machen würde.
Es ist aber sinnvoll falls ein Divisor doch mal Null ist, das dann die Berechnungen weiter fortgesetzt werden können und es dewegen nicht zu einem Abbruch kommt.
Und wo ist da das Problem mit der exception? Ist doch letzlich auch nur ein Irq... und wozu eigentlich die Berechnungen fortsetzen? Da kommt doch eh kein korrektes Ergebnis heraus.
Wenn ich dir jetzt erklären muss, warum eine Berechnung berechnet werden soll und dabei es wenig Sinn macht die Berechnung abzubrechen, weil sonst die Berechnung ja nicht fortgesetzt werden kann und wir deswegen auch nicht zu einem Ende mit dieser Berechnung kommen können, dann frage ich mich warum du hier, bei so einem Sonderfall, dich so stur verhälst. Wo ist dein Problem?

Für mich wäre das Ergebniss korrekt genug, wenn der Dividend in die Zielregister eingetragen werden würde und die Berechnung dann auch ohne Exception fortgesetzt werden.
Und falls es mal einen Sonderfall gibt kann man den auch Recht leicht implementieren...
Ich möchte eher diese in meinen Augen völlig dusselig implementiete Exception los werden, weil ich darin keinen programmtechnischen Sinn sehe. Ist das denn wirklich so schwer zu begreifen?

Dirk
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: dword dezimal ausgeben

Beitrag von freecrac »

oDOSseus hat geschrieben:Wann teilst du durch null-Adressen???

Folgende nicht abweisbare Gründe gibt es für die Exception:

1. Es ist die einzige richtige Lösung der Rechnung: Nämlich keine Lösung
Moooment mal. Wer darf es denn bestimmen was in einem ganz speziellen Fall für uns richtig, oder falsch ist?
Ich verate es dir. Wir selber dürfen es bestimmen, da es unser Recht ist so etwas für uns selber zu entscheiden.
2. Der Programmierer erfährt so, ob er gerade Murks macht, denn es ist Murks wenn man durch Null teilt
Das Ergebniss muss aber doch gar kein Murks sein, wenn man die von mir beschriebenen Änderungen vornimmt. Oder gibt es dabei erhebliche schaltungstechnische Probleme so etwas zu entwickeln?
3. Der Programmierer kann die Exception auch so einstellen, dass einfach nichts geschieht.
Dann könnte man diese Exception ja auch so weit es mögklich ist ganz aus der CPU entfernen.
4. Da das Ergebnis undefiniert ist, müsste ein neuer Industriestandard geschaffen werden, an den sich alle halten
Bei diesem Industriestandard soll dann aber das Ergebniss nicht mehr undefiniert bleiben.
5. In der Mehrzahl der Fälle, wo man durch Null teilt, ist dies nicht erwünscht.
Du meinst in der Mehrzal, wo durch Null geteilt wird möchte man eigentlich gerne ein Exception auslösen?

Diese Betrachtungsweise war mir bisher noch fremd, denn ich gehe davon aus dass solche Exception in der Regel nicht beabsichtigt waren.
Ich gehe fest Davon aus, dass in den Fällen, in denen du durch Null teilst eig. nur einen gewissen Fall (Adresse gleich null) nicht abfangen willst, der eig. nicht durch eine division lösbar ist, den du aber trotzdem durchlaufen willst, um Code zu sparen. Dein Algorithmus (der wahrscheinlich noch sehr rahr ist) ist aber kein Argument für eine Änderung weg von der Div-0-Exception.
Der Wert soll als Ganzes erhalten bleiben genauso wie bei Div geteilt durch eins und zwar unabhängig davon welcher zu berechnende Wert im Dividend enthalen ist. Wenn im Dividend die Adresse 1000h enthalten ist und wir teilen durch Null, dann soll in den Zielregistern ebenfalls die Adresse 1000h eingetragen werden, damit wir diese Adresse danach verwenden können.
Außerdem entsteht ab und zu ein Überlauf bei einer divsion durch null. Um den abzufangen, müsste die CPU also sowieso vor jeder divison die Register auf Null prüfen. Das ist aber deine Aufgabe. Bei meinem alten DOS PC war es so, das CIV1 immer durch null teilte, wenn die CPU zu schnell war. Das ging nur 1 mal gut. beim 2. mal stürzte das OS dann ganz ab, da der Überlauf dieses korumpierte.
Welcher Überlauf?

Dirk
Antworten