使用汇编语言8086中的字符串指令滚动屏幕

时间:2015-12-10 15:54:12

标签: assembly x86 vga

我有一个使用字符串指令滚动屏幕的任务。我的代码工作得不好,我无法弄清楚问题。代码在屏幕上打印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

1 个答案:

答案 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