Hello,
Ich muss nun einmal 16 durch 16-Bit teilen. Kann mir jemand das Grundprinzip erklären? Wenn ein ASM-Code gleich dabei ist, umso besser.
Ich verstehe jetzt nicht, wo da das Problem ist.
Du legst in einem Register den Startwert (Dividend) ab. [2]
Im anderen Register legst Du den Divisor ab. [2]
Ein drittes Register benutzt Du zum zählen. [2]
Nun baust Du eine Schleife auf, in der vom Dividenden der Divisor so fot abgezogen wird, bis der Dividend kleiner ist (oder Null [1]), als der Divisor. Ist dieser Punkit erreicht, hast Du im Zählerregister den Quotienten und im Dividenden-Register den Rest stehen.
Interessant an der Sache ist,
[1} Grenzen betrachten:
Wenn Du dich der Grenze des Definitionsbereiches näherst, musst Du diese sauber erkennen. Es ist also wichtig, ob Du negative Zahlen zulässt, oder nicht. Durch den Überschlag [3] kann es sonst zu falschen Ergebnissen führen.
[2] Welches Register wofür verwenden:
Das hängt vom Prozessor und teilweise auch ungeschriebenen Konventionen ab.
I.d.R. wird z.B. das C*-Register zum Zählen verwendet. Das hängt meistens davon ab, welche Assemblerbefehle bestimmte Register voraussetzen.
[3] Das Überschreiten einer Grenze, also ein Überchlag, wird i.d.R. in einem speziellen Register oder einem Flag angezeigt (z.B. Carry-Flag). Oft muss man die Flags erst in ein Register laden, um sie abfragen zu können, manchmal gibt es aber auch spezielle Assembler-Befehle, um einzelne Flags gezielt abzufragen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg