In Assembler könnte das so aussehen:
Angenommen, die 8 Bit-Zahl steht im AX-Register, genaugenommen im
unteren Teil von AX, also in AL.
Eine Multiplikation mit 2 schiebt die ganze (binäre) Zahl um eine Stelle
nach vorne.
z.B. 0100b ist 4 und das mal zwei ist 8 also 1000b
Da man multiplizieren kann, ließe sich auch mit dem Befehl LEA
herumprobieren.
siehe http://dflund.se/~john_e/gems/gem0009.html (Titel: LEA a power
command)
Um "Alignment" im Register zu erreichen, kann man mit 4 multiplizieren.
Dadurch wird der Inhalt von AX um zwei Stellen nach links geschoben.
Der gefragte Inhalt liegt jetzt oberen Teil vom AL-Register.
Da nützt er aber nicht unbedingt viel. Wie kommt man jetzt passend in
den unteren Teil im AH Registerteil?
Umgekehrt kann man jeweils, um die gewünschten Stellen nach rechts zu
bekommen, mit 2 dividieren. Mit 2 dividieren heißt, die ganze Zahl um
eine Stelle nach rechts schieben. Aus 1000b wird dann 0100b.
Mit dem Assemblerbefehl SHR AL, 2 (Shift Right) wird die Zahl in AL um
zwei Stellen nach rechts geschoben (aber durch 4 geteilt). Die linke
Seite wird normalerweise mit Nullen aufgefüllt. Bei einem arithmetischen
Rechtsshift bleibt das Vorzeichen (die 1 am Anfang bei negativen Zahlen
erhalten).
Um den Rest Bits loszuwerden, die noch unpassend im AX-Register
abhängen, hilft eine logische Operation weiter xxxx xyyy -> 0000 0111.
Also: AND AL, 07.
Für ASCII-Ausgabe (Interrupt) bräuchte man nur noch 30h Draufzählen.
Siehe hierzu auch:
http://andremueller.gmxhome.de/befehle.html#bitschiebebefehle
Was auch noch ginge, ist z.B. mit dem Assemblerbefehl BT (Bittest)
herumzumachen. BT speichert das Prüfergebnis im Carryflag.
Dieses kann man ausgeben mit dem ADC Befehl, also Add Carry wohin und
was dazu?
1 | BT eax, 4 ; Ist Bit Nummer 4 von rechts gesetzt?
|
2 | MOV dl, 0 ; dl initialisieren
|
3 | ADC dL, 0 ; Ausgabe des Übertrags in dl, aber sonst nichts.
|
4 | LEA edx, [edx + edx *1] ; zum Bits nach links schieben, Platz machen.
|
5 | BT eax, 3
|
6 | ADC dL, 0
|
7 | LEA edx, [edx + edx *1];
|
8 | BT eax, 2
|
9 | ADC DL, 0
|
So (oder so ähnlich) hätte man dann alle drei Bits zum Ausgeben als
Variable zusammen.