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