myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [Assembler]TSR, Zahlen (8bit, ggf 16bit) in Dual/Dezimal/Hex aufm Bildschirm ausgeben (https://mygully.com/showthread.php?t=2053162)

myrix 30.05.10 13:39

[Assembler]TSR, Zahlen (8bit, ggf 16bit) in Dual/Dezimal/Hex aufm Bildschirm ausgeben
 
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:



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!

Banghard 30.05.10 14:30

Wenn ich es richtig verstanden habe, dann musst du folgenden Pseudocode in Assembler umsetzen:

Code:

int counter = 0;

while counter < 8 {
    if(AL.carryflag == 0){
        print 0
    }
    else print 1;

    AL.shiftleft();        // AL << 1

    counter++;
}


Die Aufgabenstellung ist ja ein Ascii Zeichen einzulesen und dann bitweise auszugeben. Ein Ascii-Zeichen entspricht 8 Bit, folglich weißt du schonmal, dass du eine Schleife brauchst, die genau 8 mal durchläuft. Wenn ich es richtig verstanden habe, dann sollst du pro Schleifendurchlauf das erste Bit der Speicherstelle untersuchen (carry flag) und je nach Wert 1 oder 0 ausgeben und danach einen Shift nach links machen, sodass das folgende Bit nun an erster Stelle steht. Wenn die Schleife dann 8 mal durchgelaufen ist, hast du eine Ausgabe in Form von "01001101".

1. Schleifendurchlauf
01001101
-> print 0
-> shiftleft

2. Schleifendurchlauf
10011010
-> print 1
-> shiftleft

3. Schleifendurchlauf
00110100
-> print 0
-> shiftleft

usw.


Diesen Algorithmus musst du dann nur noch in der Sprache deiner Wahl umsetzen.

kramido 30.05.10 15:04

Zu ergänzen ist hier noch, dass Initial nochmal geshiftet werden muss.

Der Befehl SHL schiebt das oberste Bit des Registers in das Carry-Flag. Dieser Wert wird dann nur noch abgefragt.

Ich hoffe mal, dass nachfolgender ASM-Code das verdeutlicht:

Code:

;AL: Eingabebyte
;CX:Zählerwort

;Wie häufig soll geshiftet werden?
MOV CX, 8
SCHLEIFE$ANFANG: ;Label für Schleife
SHL AL,1; Linksshiften
;Prüfung auf 0/1
JC AUSGABE1 ;Sofern Carry gesetzt ist, zur Ausgabe für 1 springen

;
;Hier Null ausgeben
;
BRA SCHLEIFE$ENDE ;zum Schleifenende springen

AUSGABE1: ;Label für 1 ausgeben
;
;Hier Eins ausgeben
;

SCHLEIFE$ENDE:
DEC CX ; Zähler verringern
JNZ WEITER ;Sofern noch Durchläufe, weitermachen

viel Erfolg bei deiner Prüfung!

Edit: Zum Thema Ein/Ausgabe: Das funkioniert, soweit ich weiß, über den Interrupt 21H. Dazu bin leider aktuell noch nicht nüchtern genug..

myrix 05.06.10 14:08

Zitat:

Zitat von kramido (Beitrag 20820214)
viel Erfolg bei deiner Prüfung!

Danke dir. Es kamm einen beliebes Zahlensystem in Binär umwandeln dran. Aufjedenfall hab ichs geschaft :D

kramido 06.06.10 00:55

Glückwunsch! ;)

Kann dann wohl geschlossen werden..


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.