我有一个使用字符串指令滚动屏幕的任务。我的代码工作得不好,我无法弄清楚问题。代码在屏幕上打印A-Y,然后它应该将第一行滚动到第二行,依此类推,但它会复制第一行,依此类推。
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
答案 0 :(得分:3)
您的代码中有2个问题:
您忘记在从屏幕复制到 Array1 缓冲区的部分中编写mov si,0
。
您应该从屏幕底部开始滚动您指示的方式(@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