0

良い一日!私はアセンブリ言語 (特に 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


私がやろうとしているのは.、ボールが右に移動するように、1 秒ごとにドットを印刷することです。ただし、ドットを印刷してから、ボールストリングをもう一度印刷するだけです。

現在、最初のボールをクリアしてから、次の 3 つの列に移動することを考えています。ただし、文字列全体を出力するために、文字ごとに列と行を既に操作しているため、混乱を招きます。

ボールを動かすのを手伝ってください。どうもありがとうございました!

編集

ジム・ミシェル卿に続いて、 を呼び出した直後に , を追加しましMOV AL, COLた。ただし、ボールは 1 回しか表示されず、プログラムは停止しません (表示されません)。INC ALMOV COL, ALMOVEJ:/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
4

1 に答える 1

0

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 などです。. .

于 2013-03-12T13:19:22.433 に答える