2015-12-10 4 views
-1

J'avais une tâche à faire défiler l'écran en utilisant des instructions de chaîne. Mon code ne fonctionne pas très bien et je n'arrive pas à comprendre le problème. Le code imprime A-Y sur l'écran, puis il doit faire défiler la première ligne vers la deuxième et ainsi de suite, mais il copie plutôt la première rangée et ainsi de suite.Écran de défilement à l'aide d'instructions de chaîne dans le langage d'assemblage 8086

org 100h 

.DATA 

ARRAY1 DW 80 DUP(0) 

.CODE     

MOV CX,25   
MOV AX,0XB800 
MOV ES,AX 
MOV DI,0 
MOV AH,0X07 
MOV AL,41H 

L: 
MOV BX,CX 
MOV CX,80 
REP STOSW 
INC AL 

MOV AX,DS 
MOV ES,AX 
LEA DI,ARRAY1 

MOV AX,0XB800 
MOV DS,AX 
MOV CX,80 
CLD 
REP MOVSW 

MOV CX,25 
MOV DI,160 

MOV SI,0 

K: 
MOV BX,CX 
MOV AX,0XB800 
MOV ES,AX 

MOV CX,80 
CLD 
REP MOVSW 
ADD DI,160 
CMP DI,3840 
JE EXIT 
ADD SI,160 
JMP K 

EXIT: ret 
+3

Commenter votre code, surtout si vous voulez que les autres pour aider et apprendre à utiliser un débogueur. Cela dit, si je comprends votre code, copiez d'abord la ligne 1 vers la ligne 2, puis essayez de copier la ligne 2 vers la ligne 3, mais bien sûr, vous avez déjà écrasé la ligne 2. Vous devriez exécuter cette copie à l'envers. – Jester

+0

@Jester il y a une instruction MOVS donc il ne doit pas copier les lignes et DS et ES pointent tous les deux vers la mémoire VGA (sauf pour copier la première ligne vers le tableau). – Masu

+1

Votre boucle 'REP MOVSW' à' K' copie les lignes (dans la mémoire vga) comme je l'ai dit. – Jester

Répondre

3

Vous avez 2 problèmes dans votre code:

  • Vous avez oublié d'écrire mov si,0 dans la partie que les copies de l'écran dans le Array1 tampon.

  • Vous devriez commencer au bas de l'écran pour faire défiler comme vous l'avez indiqué (@Jester l'a déjà signalé). Ce code simple fera l'affaire:

    mov AX, 0XB800 
    mov es, ax 
    mov ds, ax 
    mov di, 3840  ;Address of 25th row 
    cld 
    K: 
    lea si, [di-160] ;Address of row above 
    mov cx, 80 
    rep movsw 
    sub di, 320 
    jne K    ;DI=0 is end