TSR, Zahlen (8bit, ggf 16bit) in Dual/Dezimal/Hexadezimal auf dem Bildschirm anzeigen



  • TSR, Zahlen (8bit, ggf 16bit) in Dual/Dezimal/Hexadezimal auf dem Bildschirm

    Ich bin ein blutiger Anfänger in asm und schreibe am Dienstag eine Praktische Prüfung.

    Mein Lehrer hat mir das folgende als Schwerpunkte für die Prüfung gegeben :

    TSR, Zahlen (8bit, ggf 16bit) in Dual/Dezimal/Hexadezimal auf dem
    Bildschirm anzeigen

    ich habe dazu folgende Aufzeichnungen, die ich aber nicht mehr ganz verstehe:

    http://img72.imageshack.us/img72/7631/dsc00364t.jpg

    Mir ist nur klar, das ich die eingebene Zahl im Register irgendwie Bitweise mit shl verschieben muss, aber wie das genau in Code Umgesetzt wird weis ich nicht!

    Hat evtl mal jemand ein kurzes Code-beispiel wie man das umsetzen könnte(Eingebene Zahl binär wieder ausgeben), oder eine Erklärung?

    mfg

    Danke schonmal!



  • Könntest Du etwas genauer beschreiben, was Du machen sollst?
    Und in welcher Beziehung stehen denn die Zahlumwandlungen zu einem TSR?



  • öhhm ja das tsr ist da nur so reingeruscht gehört nicht dazu. . .

    im einfachsten fall soll einfach nur eine Ascii zahl(eingegeben und hex im speicher abgelegt) binär wieder ausgegeben werden.

    mfg



  • Was die Grundlagen zur Umwandlung integer->String und einige Details zur Umwandlung in einen String in Dezimaldarstellung betrifft, kannst du dir mal diese Links durchlesen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-236735-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-integer.html
    dann
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-240495-and-postdays-is-0-and-postorder-is-asc-and-start-is-40.html
    und auch Wikipedia weiss was dazu, ich finde allerdings die Seite nicht mehr. 😑

    Fuer den Fall integer -> String in Binaerdarstellung kann die Umwandlung wie auf deinem Zettel grob aufgezeichnet vereinfacht werden:
    Du kopierst dir deine Ganzzahl in irgendein Arbeitsregister und schiebst dieses dann 1mal nach links (Befehl shl <?>, 1 auf x86). Das hoechstwertigste Bit (MSB), das dabei links rausfaellt, landet im Carry-Flag. Damit kannst du die einzelnen Bits deiner Ganzzahl nacheinander auf 1 oder 0 pruefen (mit den bedingten Sprungbefehlen jc/jnc) und entsprechend "1" oder "0" auf den Bildschirm schreiben (abhaengig vom Betriebssystem). Das wiederholst du dann in einer Schleife so oft, bis du alle Bits deiner Ganzzahl durch hast. Also 8mal fuer ein Byte.
    Da du von links zu schreiben anfaengst und das MSB zuerst rausfaellt, kommt die Binaerzahl auch in der richtigen Reihenfolge raus.

    Fuer die Konvertierung in einen String in Hex-Darstellung, funktioniert die Sache recht aehnlich.
    Zuerst brauchst du einen String, der alle Hex-Ziffern enthaelt. zB. "0123456789ABCDEF".
    Allgemein rotierst du dann deine Ganzzahl um 4 nach links (Befehl rol auf x86) und kopierst die untersten 4Bit heraus (zB. indem unteres 8Bit-Register - zB. al - per mov und dann mit passender Bitmaske 0x0F verunden - Befehl and auf x86). Diese so isolierten 4Bit nimmst du als Index in den Hex-String (auf Anfangsadresse addieren) und gibst das so ausgelesene Zeichen auf dem Bildschirm aus. Das ganze machst du dann in einer Schleife n/4 mal, wobei n die Anzahl Bits in deiner Ganzzahl ist. Auch bei dieser Methode kommt die Zahl in der richtigen Reihenfolge heraus.
    Fuer ein Byte laesst sich das so weit vereinfachen, dass du nicht mal eine Schleife brauchst. Du kopierst dein Byte einfach in 2 verschiedene Register, isolierst einmal per and die unteren 4Bit und per Rechtsshift um 4 die oberen 4Bit und benutzt die beiden Ergebnisse wieder als Index in den Hex-String.

    Mit TSRs hat das allerdings nichts zu tun.



  • Danke für die Links ich werde sie mir zur gemüde führern, deine erklärung is auch top! Danke



  • hi, du hast leider nicht (wirklich) geschrieben, was für eine Art Ausgabekonvertierung du brauchst 😞

    eine spannende Vertiefungsaufgabe: den Hexstring 0123456789ABCDEF
    in einem Rutsch mit einem 16/32Bit Multipass-Register konvertieren...;)

    Man muss aber weitgehend unabhängig vom Ausgabetyp darauf achten, dass für eine ASCII-Konvertierung der Buchstaben 7 mehr draufgezählt werden müssen, also 1-9 plus 30h vs A-F plus 37h



  • nachtfeuer schrieb:

    den Hexstring 0123456789ABCDEF
    in einem Rutsch mit einem 16/32Bit Multipass-Register konvertieren

    Was ist den ein Multipass-Register? Und wie soll man dann 16 Byte in einem 16/32 Bit Register halten?



  • Signalfeuer schrieb:

    nachtfeuer schrieb:

    den Hexstring 0123456789ABCDEF
    in einem Rutsch mit einem 16/32Bit Multipass-Register konvertieren

    Was ist den ein Multipass-Register? Und wie soll man dann 16 Byte in einem 16/32 Bit Register halten?

    Wer keinen Multipass hat, hat noch viel Try & Error vor sich. Man kann auch dieses Verständnis nicht schnell schnell ablesen, sondern es entwickelt sich ("optimiert" sich) mit der Zeit und den Lösungen, die man gesucht oder gefunden hat -> "Manchmal muß man proben um es zu verstehen" 😉

    Wem kein Multipass-Register zur Verfügung steht, kann Multipass simulieren.

    Wenn die Lösung heisst, eben mal Prüfungsfragen korrekt zu beantworten, dann ist es in der Regel hilfreicher, die zum Kurs empfohlenen Bücher zu lesen oder Mitschüler zu fragen oder Lehrer. Es gibt zwar auch sehr gutes Material zum schnellen Lernen von Prüfungslösungen, aber da der Themenersteller nur magere Zusammenhangsinfo anbot(z.B. Betriebssystem oder Waschmaschinentyp), fällt die Entscheidung schwer, einschlägige Literatur oder treffende Links anzugeben, geschweige denn nützliche Werkzeuge(es gibt hervorragende), welche das Verständis effektiv beschleunigen.

    Ich kann noch sagen, das das Assemblerforum wohl am meisten darunter leidet, wenn ThemenerstellerInnen nur mit Symbolbegriffen arbeiten, ohne einen brauchbaren (möglichst konkreten) Zusammenhang herzustellen. Dabei kostet es gar nicht soviel, sich ein grundlegendes Verständnis zu erarbeiten:

    Der String 0123456789ABCDEFh enthält 8Bytes(64bit), die auf Multipass warten.



  • wow!
    Was für eine Antwort nachfeuer.

    nachtfeuer schrieb:

    Dabei kostet es gar nicht soviel, sich ein grundlegendes Verständnis zu erarbeiten:

    Der String 0123456789ABCDEFh enthält 8Bytes(64bit), die auf Multipass warten.

    👍


Anmelden zum Antworten