2015-12-10 132 views
-1

我有使用字符串指令滾動屏幕的任務。我的代碼不工作得很好,我無法弄清楚問題所在。代碼在屏幕上打印A-Y,然後它應該將第一行滾動到第二行,等等,但它相當於複製第一行,依此類推。使用匯編語言中的字符串指令滾動屏幕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

評論你的代碼,特別是如果你希望別人幫助,並學會使用調試器。也就是說,如果我理解你的代碼,你首先複製第1行到第2行,然後嘗試複製第2行到第3行,但是當然你已經覆蓋第2行。你應該向後運行該複製。 – Jester

+0

@Jester有一個MOVS指令,所以它不應該複製行,DS和ES都指向VGA存儲器(除了複製第一行到數組)。 – Masu

+1

正如我所說,你的'REP MOVSW'循環在'K'複製行(在vga內存中)。 – Jester

回答

3

你在你的代碼2個問題:

  • 你忘了在部分寫mov si,0從屏幕到數組1緩衝區拷貝。

  • 您應該從屏幕底部開始滾動您指定的方式(@Jester已經指出了這一點)。這個簡單的代碼就可以了:

    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