Hi steckl,
Die Division komplett in Software zu schreiben, ist übrigens gar nicht so schwer (nicht mal in Assembler), wenn man das Prinzip der "schriftlichen Division" wirklich verstanden hat.
Da müsste ich mir erst noch was überlegen.
okay, als ich schrieb "gar nicht so schwer", dachte ich auch schrittweise.
Ich bin vom grundsätzlichen Algorithmus (Rechenschema) ausgegangen: Vom Dividend von links aus (MSB) eine Stelle nach der anderen nehmen, durch den Divisor teilen, Divisionsergebnis ergibt eine Stelle des Ergebnisses, Divisonsrest mit der nächsten Stelle ergänzen, nächster Schritt.
Diesen grundsätzlichen Ablauf könnte man in sehr vielen Programmiersprachen realisieren (hab ich vor Jahren mal mit einer kleinen 8bit-CPU in Assembler gemacht), und es ist sehr hilfreich, wenn man sich diesen Ablauf erstmal als Flowchart skizziert oder in Pseudocode formuliert.
Und dann stellt man plötzlich fest, dass es für das Prinzip völlig egal ist, ob man Bit für Bit, Ziffer für Ziffer oder Byte für Byte dividiert, und man kann sich die Aufgabe so portionieren, wie es die gewählte Programmiersprache oder CPU (im Falle von Assembler) am besten hergibt.
Bis jetzt kann ich aber noch nichtmal Subroutinen Programmieren, also wirds wohl noch ein bisschen dauern.
Klar. Aber einen guten Rat gebe ich dir schon jetzt: Versuche immer, nicht vorrangig eine bestimmte CPU-Instruktion isoliert zu betrachten und verstehen zu wollen, sondern versuche, das Konzept und die Zusammenhänge als Ganzes zu sehen. Das ist am Anfang nicht einfach, erleichtert aber nach einer gewissen Anlaufphase das weitere Lernen (auch selbständig) erheblich.
Findest du auch, dass ich gleich mit 32-Bit-Assembler anfangen sollte?
Was spricht dagegen? Schwieriger wird es dadurch nicht. Anspruchsvoller wird es teilweise dann, wenn du nicht nur die reine Programmierung betrachten willst, sondern auch übergeordnete Themen wie Speicherverwaltung, virtuelle Adressierung usw., ... Das sind Dinge, die dann (fast) zwangsläufig dazukommen, und da wird's zum Teil ... hmm, nicht ganz trivial. ;-)
Wäre dann die 32-Bit-Division ohne Probleme lösbar?
Well, das Problem würde sich verlagern. Anstatt DX:AX durch BX zu dividieren (also 32bit durch 16bit), könntest du EDX:EAX durch EBX dividieren, macht also 64bit durch 32bit. Wenn dich dabei auf einen Dividend mit nur 32bit Breite beschränkst wie bisher (EDX also 0 bleibt), hast du gewonnen. Aber hilft dir das wirklich? Es ist immer eine Frage des notwendigen Zahlenbereichs.
Schönen Abend noch,
Martin
Solange der Nagellack nicht trocken ist,
ist eine Frau praktisch wehrlos.
(Burt Reynolds, US-Schauspieler)