2015-12-10 95 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