Assembly 如何使字符串向右移动(汇编中的视频服务)
你好!我是汇编语言新手(特别是TASM),我这里有一个简单的球(字符串,由字符组成),我想把它移到右边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
.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了。