Assembly 如何使字符串向右移动(汇编中的视频服务)

Assembly 如何使字符串向右移动(汇编中的视频服务),assembly,x86,dos,tasm,Assembly,X86,Dos,Tasm,你好!我是汇编语言新手(特别是TASM),我这里有一个简单的球(字符串,由字符组成),我想把它移到右边 .MODEL SMALL .STACK 100 .DATA ball DB 10," #######" DB 10,"# #" DB 10,"# #" DB 10,"# #" DB 10," #######","$" ROW1 DB 5 R

你好!我是汇编语言新手(特别是TASM),我这里有一个简单的球(字符串,由字符组成),我想把它移到右边

  .MODEL  SMALL
  .STACK  100
  .DATA

    ball DB 10," #######"
         DB 10,"#       #"
         DB 10,"#       #"
         DB 10,"#       #"
         DB 10," #######","$"
    ROW1 DB 5   
    ROW2 DB 10
    COL DB 25       
    MAX     DB ?
    RAND    DB ?
    ATT DB 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5

 .CODE
    .STARTUP
        mov ax, @data       ;required
        mov ds, ax

        MOV AX, 3       ; 80x25 color
        INT 10H         ; video BIOS call   
        MOV AH, 2       ; set cursor position
        MOV BH, 0       ; display page number
        MOV DH, ROW1        ; row number
        MOV DL, COL     ; column number
        INT 10H         ; video BIOS call
        LEA BP, ATT ; point to first attribute array
        CALL FAR PTR MOVE  ; display first line of video text

        MOV MAX, AL ;max=10
            @TIMELOOPS1:
                ;get system time
                MOV AH, 2Ch
                INT 21h
                MOV RAND, DH
            @WAIT1SEC1:
                MOV AH, 2Ch
                INT 21h
                CMP RAND, DH
                JE @WAIT1SEC1

                MOV AH, 2
                MOV DL, '.'
                INT 21H
                MOV AH, 2       ; set cursor position
                MOV BH, 0       ; display page number
                MOV DH, ROW2        ; row number
                MOV DL, COL     ; column number
                INT 10H         ; video BIOS call
                LEA BP, ATT     ; point to first attribute array
                CALL FAR PTR MOVE   ; display first line of video text

                ;clear

                DEC MAX
                CMP MAX, 0
                JNE @TIMELOOPS1     
    .EXIT

    MOVE PROC FAR
        MOV SI, 0   ; set up array pointer
        NEXT:   
            MOV AL, ball[SI]; get name character
            ;xor al, al
            CMP AL, '$'   ; exit if character is 0
            JZ EXIT  
            CMP AL, 10
            JE LF
            MOV BH, 0   ; display page number
            MOV BL, [BP+SI] ; get attribute
            MOV CX, 1   ; do 1 character
            MOV AH, 9   ; write character/attribute on screen
            INT 10H     ; video BIOS call
            INC SI      ; point to next character/attribute
            ADD DL, 1   ; move one column to the right
            MOV AH, 2   ; set cursor position
            INT 10H     ; video BIOS call
            JMP NEXT    ; and continue

        EXIT:  ret

        LF:
            MOV BH, 0   ; display page number
            MOV BL, [BP+SI] ; get attribute
            MOV CX, 1   ; do 1 character
            MOV AH, 0Ah   ; write character/attribute on screen
            MOV AL, 10
            INT 12H     ; video BIOS call
            INC SI      ; point to next character/attribute
            ADD DH, 1   ; move one column to the right
            MOV DL,0
            MOV AH, 2   ; set cursor position
            INT 10H     ; video BIOS call
            JMP NEXT    ; and continue

    MOVE ENDP

END

我要做的是每隔一秒钟打印一个点,这样球就会移到右边。但它只打印一个点,然后再次打印球串

现在,我正在考虑清除初始球,然后将其移动到下3列。但是,它会让人困惑,因为它已经在处理每个字符的列和行,以便打印整个字符串。

请帮我把球挪动一下。多谢各位
编辑

继吉姆·米谢尔爵士之后,我在调用
MOVE
后立即添加了
MOV-AL,COL
INC-AL
MOV-COL,AL
。但是,它只显示一次球,程序不会停止(我看不到
J:/TASM/BIN


  .MODEL  SMALL
  .STACK  100
  .DATA

    ball DB 10," #######"
         DB 10,"#       #"
         DB 10,"#       #"
         DB 10,"#       #"
         DB 10," #######","$"
    ROW1 DB 5   
    ROW2 DB 10
    COL DB 25       
    MAX     DB ?
    RAND    DB ?
    ATT DB 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5

 .CODE
    .STARTUP
        mov ax, @data       ;required
        mov ds, ax

        MOV MAX, AL ;max=10
            @TIMELOOPS1:
                ;get system time
                MOV AH, 2Ch
                INT 21h
                MOV RAND, DH
            @WAIT1SEC1:
                MOV AH, 1
                INT 16h
                ;JNZ @ENDPROGRAM
                MOV AH, 2Ch
                INT 21h
                CMP RAND, DH
                JE @WAIT1SEC1

                MOV AX, 3       ; 80x25 color
                INT 10H         ; video BIOS call   
                MOV AH, 2       ; set cursor position
                MOV BH, 0       ; display page number
                MOV DH, ROW2        ; row number
                MOV DL, COL     ; column number
                INT 10H         ; video BIOS call
                LEA BP, ATT     ; point to first attribute array
                CALL FAR PTR MOVE   ; display first line of video text
                MOV AL, COL
INC AL
MOV COL, AL

                ;clear

                DEC MAX
                CMP MAX, 0
                JNE @TIMELOOPS1     
    .EXIT

    MOVE PROC FAR
        MOV SI, 0   ; set up array pointer
        NEXT:   
            MOV AL, ball[SI]; get name character
            ;xor al, al
            CMP AL, '$'   ; exit if character is 0
            JZ EXIT  
            CMP AL, 10
            JE LF
            MOV BH, 0   ; display page number
            MOV BL, [BP+SI] ; get attribute
            MOV CX, 1   ; do 1 character
            MOV AH, 9   ; write character/attribute on screen
            INT 10H     ; video BIOS call
            INC SI      ; point to next character/attribute
            ADD DL, 1   ; move one column to the right
            MOV AH, 2   ; set cursor position
            INT 10H     ; video BIOS call
            JMP NEXT    ; and continue

        EXIT:  ret

        LF:
            MOV BH, 0   ; display page number
            MOV BL, [BP+SI] ; get attribute
            MOV CX, 1   ; do 1 character
            MOV AH, 0Ah   ; write character/attribute on screen
            MOV AL, 10
            INT 12H     ; video BIOS call
            INC SI      ; point to next character/attribute
            ADD DH, 1   ; move one column to the right
            MOV DL,0
            MOV AH, 2   ; set cursor position
            INT 10H     ; video BIOS call
            JMP NEXT    ; and continue

    MOVE ENDP

END

在您的代码中,在调用
MOVE
proc之前,您有以下内容:

MOV DL, COL     ; column number
INT 10H         ; video BIOS call
LEA BP, ATT     ; point to first attribute array
CALL FAR PTR MOVE   ; display first line of video text
如果要在每次循环中向右移动,则必须在每次循环中增加
COL
值。我建议在调用
MOVE
后添加以下内容:

MOV AL, COL
INC AL
MOV COL, AL

所以第一次通过循环,
COL
是25。下次是26岁,等等

谢谢大家!!但是,它不会移动。(请参见编辑)。也许我需要先清除前一个球?如果是,我该怎么做?我尝试了
MOV-AX,600h
MOV-BH,7
XOR-CX,CX
MOV-DX,184Fh
INT-10h
,但它清除了整个屏幕。清除球的最简单方法是再次调用
MOVE
过程,但使用空格数组而不是球字符。您必须修改
MOVE
,以便以寄存器对的形式传递起始地址(即球或空格)。或者,可能有一个BIOS调用来清除从给定光标位置开始的一些列;我不记得了。我已经很久没有使用BIOS了。