2016-11-21 2 views
1

Ich benutze emu8086 Assembler und ich bin neu in der Assemblersprache. Ich möchte alle A-Z Alphabete in gelber Farbe mit schwarzem Hintergrund drucken. Meine Schleife funktioniert nicht. Es läuft weiter und nur B-Alphabet wird angezeigt.
Kann mir bitte jemand helfen? Hier ist mein Code:Loop funktioniert nicht zum Drucken von Alphabeten

include emu8086.inc 
ORG 100h 
MOV AX,0B800h 
MOV DS,AX 
MOV CX,26 
ALPHABETS: 
MOV CL,41h 
ADD CX,1 
MOV CH,00001110b 
MOV BX,0x0000 
MOV [BX],CX 
loop ALPHABETS 
RET 
+0

Versuche durch es in Ihrem Kopf zu Fuß: Sie setzen cl bis 41h, du fügst 1 hinzu, du schreibst es, dann fährst du zurück zu ALPHABETS wo du .... –

+0

@DavidWohlferd 'include emu8086.inc ORG 100h' 'MOV AX, 0B800H' ' MOV DS, AX' 'MOV CX, 25' ' MOV AH, 2' 'MOV DL, 65' ' alpha: '' INT 21h' 'INC DL' 'MOV DH, 00001110b' ' ADD DH, 1 ' 'MOV BX, 0x0000' ' MOV [BX], DX' 'Schleife alpha' ' RET' jetzt sein Druck aber ** A ** verwandelt sich am Ende in ** Z ** und gelbe Farbe gilt nur für ** Z **, was beim Start ** A ** war. Wo ich falsch liege, lass es mich wissen – haider

+0

Unter DOS gab es 2 Möglichkeiten, Dinge anzuzeigen: 1) Schreibe direkt in den Videospeicher bei 0B800h oder 2) Benutze DOS (oder BIOS) Interrupts wie 'int 21h'. Ihr neuer Code versucht beides zu tun, was das Lesen erschwert. Ich glaube nicht, dass "int 21h" eine Möglichkeit hat, Attribute (Farben) auszugeben. Wenn das wichtig ist, müssten Sie entweder das Zeichen und sein Attribut in den Speicher schreiben (Methode 1), oder Sie verwenden ['int 10h'] (https://en.wikipedia.org/wiki/INT_10H) mit AH = 09h . –

Antwort

2

Ihr Programm hat zwei Probleme:

  • Sie verwenden das CX Register sowohl für den Schleifenzähler und das Zeichen, das Sie anzeigen möchten.
  • Sie vergessen, die Adresse im BX Register zu aktualisieren und so wird alles übereinander angezeigt.

Erste Lösung CX als Schleifenzähler verwendet:

include emu8086.inc 
ORG 100h 
    MOV  AX, 0B800h 
    MOV  DS, AX 
    mov  al, "A"  ;First character 
    mov  ah, 00001110b ;YellowOnBlack 
    mov  bx, 0   ;Address in video RAM 
    mov  cx, 26 
ALPHABETS: 
    mov  [bx], ax 
    inc  al   ;Next character 
    add  bx, 2   ;Next address 
    loop ALPHABETS 
    RET 

Zweite Lösung mit dem Zeichencode selbst als Schleifenzähler:

include emu8086.inc 
ORG 100h 
    MOV  AX, 0B800h 
    MOV  DS, AX 
    mov  al, "A"  ;First character 
    mov  ah, 00001110b ;YellowOnBlack 
    mov  bx, 0   ;Address in video RAM 
ALPHABETS: 
    mov  [bx], ax 
    inc  al   ;Next character 
    add  bx, 2   ;Next address 
    cmp  al, "Z" 
    jbe  ALPHABETS 
    RET 
Verwandte Themen