2016-11-07 5 views
2

Ich versuche ein Programm in Assemblersprache zu erstellen, in dem ich einen Text oder ein Zeichen wie einen Bildschirmschoner auf dem Bildschirm verschieben möchte, dh zuerst sollte es sowohl vorwärts als auch abwärts gehen Richtung. Wenn es die untere Grenze des Bildschirms erreicht, sollte es sich vorwärts und aufwärts bewegen und umgekehrt.Moving Text Programm in Assembler Sprache

Ich habe mich selbst versucht und ich war in der Lage, das Zeichen in Vorwärts- und Abwärtsrichtung gleichzeitig zu bewegen. Wenn der Charakter die untere Grenze des Bildschirms erreicht, möchte ich, dass er sich in Aufwärts- und Vorwärtsrichtung bewegt, aber ich kann mir nicht vorstellen, wie es geht.

Ich verwende emu8086 Assembler

.model small 
.data 
st1 db "O",13,10,'$' 
.code 
main proc 
    mov AX,@data 
    mov DS,AX 

    mov BL,0 
    label1: 
    mov AH,2H 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    ADD BL,1 

    cmp DH,23   ;conditional jump 
    jz label2 
    loop label1 

    label2: 

    ; mov AH,2H 
    ; mov BH,0   ;goto-XY 
    ; mov DH,BL 
    ; mov DL,BL 
    ; INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    SUB BL,1 
    loop label2 

    mov AH,4CH 
    INT 21H 
end main 

Am Ende jeder Iteration der ersten Schleife, bin ich zu überprüfen, ob ‚DH‘ = 23, da der untere Grenzwert y-Achse das LCD-Display 23. Wenn niedriger ist Limit des Bildschirms ist erreicht, sollte es zu 'Label2' springen, aber es springt nicht auf 'Label2', die offensichtlich ist, weil ich 'Cmp' Anweisung nicht korrekt verwenden. Kann mir jemand helfen, dieses Problem zu lösen?

Hauptsache, ich möchte Hilfe mit, welche Bedingung sollte ich einchecken "label1" zu "label2" zu springen.

PS. Nur ein Anfänger in der Assemblersprache, also wenn Sie eine Lösung vorschlagen, bitte halten Sie es einfach und leicht zu verstehen. Hier ist, was ich bisher versucht habe.

+1

Welche Version der Assembly verwenden Sie? –

+0

Ich bin mir nicht sicher, was Sie mit der Version der Baugruppe meinen. Kannst du es ausarbeiten? – Yousaf

+0

Abhängig von Ihrer Architektur gibt es viele verschiedene Versionen der Assemblersprache. Einer der beliebtesten Assembler in Nasm. –

Antwort

1

Zwei Probleme:

  • Sie vergleichen DH mit 23, wenn die unteren Bildschirmrand erreicht war zu wissen, aber DH ging verloren, wenn Sie den Bildschirm gelöscht. Sie sollten BL vergleichen.
  • Entkommentieren Sie den Block, um den Cursor zu positionieren.

Hier ist der Code festgelegt:

.model small 
.data 
st1 db "O",13,10,'$' 
.code 
main proc 
    mov AX,@data 
    mov DS,AX 

    mov BL,0 
    label1: 
    mov AH,2H 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    ADD BL,1 

    cmp BL,23   ;◄■■■ COMPARE BL, NOT DH, BECAUSE 
    jz label2   ;  YOU LOST DH WHEN CLEARED SCREEN. 
    loop label1 

    label2: 

    mov AH,2H   ;◄■■■ UNCOMMENT THIS BLOCK !!! 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    SUB BL,1 
    cmp BL,1   ;◄■■■ PERSONAL CHANGE : DETECT WHEN 
    jz label1  ;  CURSOR REACHES THE TOP ☻ 
    loop label2 

    mov AH,4CH 
    INT 21H 
end main 
+1

Split Sekunde, antworten Sie nur ein paar Sekunden zuvor :-) – nopasara

+1

Problem gelöst. Danke für Ihre Hilfe. – Yousaf

1
mov DL, 79 
mov DH, 24  <-- here Dh = 24 
int 10H 

ADD BL,1 

cmp DH,23  <- so here condition never true 
jz label2 
+0

Problem gelöst. Danke für Ihre Hilfe – Yousaf