Einzelne Hexziffer ausgeben (rechte Tetrade eines Bytes)

Voraussetzung: Linke Tetrade enthält den Wert Null

Zeichen ASCII-Code
0 30
1 31
2 32
3 33
4 34
5 35
6 36
7 37
8 38
9 39
: 3A
; 3B
< 3C
= 3D
> 3E
? 3F
@ 40
A 41
B 42
C 43
D 44
E 45
F 46

Nach Zahlengruppen (0-9 und A-F) getrennte Konvertierung

IF BL <= 09
THEN BL := BL+30   Zahlengruppe 0-9
ELSE BL := BL+37   Zahlengruppe A-F
END-IF

Die 8086-Maschinensprache enthält kein IF-THEN-ELSE sondern nur IF-THEN oder IF-ELSE

BL := BL+30   beide Zahlengruppen
IF BL <= 39
ELSE BL := BL+07   nur Zahlengruppe A-F

0100  MOV AH,02
0102  MOV DL,BL
0104  ADD DL,30
0107  CMP DL,39
010A  JBE 010F
010C  ADD DL,07
010F  INT 21
0111  INT 20
Sinnvolle Testfälle: 0,9,A,F (Grenzfälle)

SHR- und SHL-Befehl

SHR Operand,...  Shift Right
SHL Operand,...  Shift left

SHR DX,1   Register
SHR DL,1   Halbregister
SHR DX,CL   Register
SHR DL,CL   Halbregister

SHL DX,1   Register
SHL DL,1   Halbregister
SHL DX,CL   Register
SHL DL,CL   Halbregister

CL enthält die Anzahl der Verschiebungen

DL-Register  
01011010 Ausgangszustand
00101101 nach SHR DL,1
00010110 nach SHR DL,1
00001011 nach SHR DL,1
00000101 nach SHR DL,1
00000010 nach SHR DL,1
00000001 nach SHR DL,1
00000000 nach SHR DL,1
00000000 nach SHR DL,1

DL-Register  
01011010 Ausgangszustand
10110100 nach SHL DL,1
01101000 nach SHL DL,1
11010000 nach SHL DL,1
10100000 nach SHL DL,1
01000000 nach SHL DL,1
10000000 nach SHL DL,1
00000000 nach SHL DL,1
00000000 nach SHL DL,1

SHR Operand,...   vorzeichenlose Division
SHL Operand,...   vorzeichenlose Multiplikation

Einzelne Hexziffer ausgeben (linke Tetrade eines Bytes)

0100  MOV AH,02
0102  MOV DL,BL
0104  MOV CL,04
0106  SHR DL,CL
0108  ADD DL,30
010B  CMP DL,39
010E  JBE 0113
0110  ADD DL,07
0113  INT 21
0115  INT 20

AND-Befehl

AND Operand1,Operand2  Logische UND-Verknüpfung

AND  0   1 
0 0 0
1 0 1

AND auf Bytes oder Wörter durch bitweise Verknüpfung. Nullsetzen der höherwertigen 4 Bit (linke Tetrade) eines Bytes:

  0 1 0 1 1 0 1 0
AND 0 0 0 0 1 1 1 1
= 0 0 0 0 1 0 1 0

Einzelne Hexziffer ausgeben (rechte Tetrade eines Bytes)

Voraussetzung "Linke Tetrade enthält den Wert Null" entfällt.
0100  MOV AH,02
0102  MOV DL,BL
0104  AND DL,0F
0107  ADD DL,30
010A  CMP DL,39
010D  JBE 0112
010F  ADD DL,07
0112  INT 21
0114  INT 20

Ziel: Zwei Hexziffern über die Tastatur einlesen und in ein Byte konvertieren

DOS-Funktion Zeichen über Standardeingabe (Tastatur) einlesen

AH=01: Funktionscode
AL=nn: ASCII-Code nn des eingelesenen Zeichens (Echo auf Standardausgabe)

AH=08: Funktionscode
AL=nn: ASCII-Code nn des eingelesenen Zeichens (ohne Echo auf Standardeingabe)

Spezialfall: DOS sendet zwei Zeichen in den Tastaturpuffer bei Sondertasten mit erweiterten Codes. Der ASCII-Code des ersten Zeichens beträgt Null, der ASCII-Code des zweiten Zeichens repräsentiert den Scancode der Sondertaste. Bei AL=0 muss INT 21 also erneut ausgeführt werden.

Einstellige Hexzahl einlesen

Prinzip: Umkehrung "Einzelne Hexziffer ausgeben (rechte Tetrade eines Bytes)"

BL := BL-30   beide Zahlengruppen
IF BL <= 09
ELSE BL := BL-07   nur Zahlengruppe A-F

0100  MOV AH,01
0102  INT 21
0104  SUB AL,30
0106  CMP AL,09
0108  JBE 010C
010A  SUB AL,07
010C  INT 20

Zweistellige Hexzahl (Halbregister) einlesen

  • Erste Hexziffer einlesen und Hexwert in das DL-Register laden
  • Multiplikation des DL-Registers mit dem (dezimalen) Wert 16
  • Zweite Hexziffer einlesen und Hexwert zum DL-Register hinzuaddieren
  • Programmbeispiel

    Ziel: Coderedundanz im Programm "Zweistellige Hexzahl (Halbregister) einlesen" vermeiden und Plausibilitätsprüfung ergänzen

    Stack und Rücksprungadressen

    SS: Stacksegment, Stapelsegment; Segmentadresse des Stacks
    SP: Stack Pointer, Stapelzeiger; Zeigt (gemeinsam mit SS) auf die Spitze des Stacks
    Physikalische Adresse := SS * 16 + SP
    Stapelprinzip = LIFO (Last In First Out)

    Mit CALL wird die Rücksprungadresse auf den Stack gelegt, und mit RET wird die Rücksprungadresse vom Stack genommen. Die Speicherung der Rü:cksprungadressen auf dem Stack erleichtert die Erstellung verschachtelter Unterprogramme:

    Programmbeispiel

    Stack nach Befehlsausführung 109 209
    109
    309
    209
    109
    209
    109
    109  
    Befehl CALL 0200 CALL 0300 CALL 0400 RET RET RET

    PUSH- und POP-Befehl

    PUSH: Operand auf Stack legen
    POP: Operand von Stack nehmen
    PUSHF: Status-Register auf Stack legen
    POPF: Status-Register vom Stack nehmen

    Sicherung der Register am Unterprogrammanfang und Restaurierung der Register am Prozedurende bedeutet, das die Register in dem Unterprogramm als lokale Variablen zur Verfügung stehen.

    Programmbeispiel

    Stack nach Befehlsausführung 0103 AX
    0103
    DX
    AX
    0103
    AX
    0103
    0103   0106 0203
    0106
    AX
    0203
    0106
    DX
    AX
    0203
    0106
    AX
    0203
    0106
    0203
    0106
    0106 0206
    0106
    0303
    0206
    0106
    AX
    0303
    0206
    0106
    DX
    AX
    0303
    0206
    0106
    AX
    0303
    0206
    0106
    0303
    0206
    0106
    0206
    0106
    0306
    0206
    0106
    0403
    0306
    0206
    0106
    AX
    0403
    0306
    0206
    0106
    DX
    AX
    0403
    0306
    0206
    0106
    AX
    0403
    0306
    0206
    0106
    0403
    0306
    0206
    0106
    0306
    0206
    0106
    0206
    0106
    0309
    0206
    0106
    AX
    0309
    0206
    0106
    DX
    AX
    0309
    0206
    0106
    AX
    0309
    0206
    0106
    0309
    0206
    0106
    0206
    0106
    0106 0209
    0106
    AX
    0209
    0106
    DX
    AX
    0209
    0106
    AX
    0209
    0106
    0209
    0106
    0106   0109 AX
    0109
    DX
    AX
    0109
    AX
    0109
    0109  
    Befehl CALL 500 PUSH AX PUSH DX POP DX POP AX RET CALL 200 CALL 510 PUSH AX PUSH DX POP DX POP AX RET CALL 300 CALL 520 PUSH AX PUSH DX POP DX POP AX RET CALL 400 CALL 530 PUSH AX PUSH DX POP DX POP AX RET RET CALL 520 PUSH AX PUSH DX POP DX POP AX RET RET CALL 510 PUSH AX PUSH DX POP DX POP AX RET RET CALL 500 PUSH AX PUSH DX POP DX POP AX RET

    Zweistellige Hexzahl (Halbregister) incl. Plausibilitätsprüfung einlesen

    Ablauf Unterprogramm Einlesen einstellige Hexzahl incl. Plausibilitätsprüfung Gesamtablauf Programmbeispiel