Frage zur Division, DIV - Befehl
-
Hallo, ich habe eine Aufgabe bekommen, in der ich Tastatursymbole in Hexzahlen umrechnen soll.
Die Zeichen bekomme ich über die Tastatur rein
MOV AH,08h
INT 21hdas Zeichen, welches einer Dezimalzahl entspricht, landet dann im AL Register.
Mein Problem ist aber, dass ich die Dezimalzahl im AX Register brauche, um den DIV Befehl einsetzen zu können.
Im AX soll die Zahl drin stehen durch die man dividieren möchte und in einem weiteren Register dann der Dividend.
Ich kann aber kein 8 Bit Register (AL) in ein 16 Bit Register (AX,BX,CX..) kopieren
Hat vielleicht jemand eine Idee, wie man das trotzdem hinbekommt ? Ich stehe momentan ziemlich auf dem Schlauch.
Gruss an alle
theflasher
-
wenn etwas in AL ist, so ist es auch in AX, und zwar in den unteren 8bits von AX
wenn AH = 0x00, dann ist AX = AL, rein von der zahlwertigkeit gesehen
-
Lies dir das mal durch und denk dann nochmal scharf darueber nach.
Daneben noch 2 Anmerkungen:
1. Wenn der Dividend nur in ax steht, denk daran, einen 8-Bit-Wert als Divisor zu nehmen (8Bit-Register oder byte).
2. Da du es bei dieser Umrechnung nur mit Divisionen durch vielfache von 2 zu tun haben wirst, waeren shift-Operationen statt einer Division mit div in jeder Hinsicht effizienter...
-
Hi, danke für eure Antworten,
hätte gleich draufkommen sollen, dass AL und AX was gemeinsam haben
Aber jetzt noch kurz zu dem Ansatz mit dem shift-right Befehl.Das hatte ich mir auch vorhin kurz überlegt und ein Divisor von 16, wäre 4 mal nach rechts verschieben. Aber ich frage mich dann, wo landet dann mein Rest ?
Beim Div Befehl landet der im AH-Register, aber ich komme jetzt auf die Schnelle nich drauf, wo beim Shift-right der Rest hinkommmt.
Vielleicht könnte Nobuo T noch kurz ein paar Worte dazu sagen.
Gruss theflasher
-
Wenn du normal shiftest, fallen die "rausgeshifteten" Bits ins Datennirvana und sind damit weg.
Den Rest einer solchen Division kannst du dir in diesem Fall durch Geschickte Verwendung der und-Verknuepfung auf den Dividend holen.
Dazu kopierst du ihn. Den einen Dividend shiftest du dann 4mal nach rechts, den anderen nimmst du und 15...
-
nicht schlecht, ich habe das jetzt einmal auf dem Papier durchgerechnet und komme sogar auf die richtigen Werte.
Allerdings habe ich noch Probleme zu verstehen, wieso ich beim Rest auf den richtigen Wert komme. Mir ist der AND -Befehl geläufig, trotzdem würde ich dich gerne bitten, vielleicht noch eine kleine Erklärung zum letzten Schritt zu schreiben.
Ok, ich glaube du musst doch nichts schreiben, außer du möchtest
Hab mir gerade nochmal alles durchgelesen und meine Rechnungen angschaut und ich denke jetzt weiß ich, was du gemeint hast.Aber zu guter letzt würde ich noch gerne wissen, ist das zweifache kopieren (einmal für Ganzzahl, einmal für Rest) letztlich schneller als einmal den div befehl anzuwenden ??
-
Zum Verstaendnis vielleicht noch:
8Bit-Wert als Hex-Zahl kannst du dir auch so vorstellen:
1. Ziffer ist Bit 7-4 und 2. Ziffer ist Bit 3-0. Mit Rechtsshift und "und" bekommst du sie dann "einzeln"...Zur Geschwindigkeit:
idR. denke ich schon, dass das schneller ist. Auf modernen CPU wird das aber so oder so kaum ins Gewicht fallen.
-
theflasher schrieb:
Ok, ich glaube du musst doch nichts schreiben, außer du möchtest
ich möchte noch was sagen, wenn ich darf
Nobuo T schrieb:
Wenn du normal shiftest, fallen die "rausgeshifteten" Bits ins Datennirvana und sind damit weg.
nicht ganz, du verheimlichst das carry flag