【发布时间】:2012-09-08 23:04:20
【问题描述】:
我正在尝试编写一个使用嵌套循环的简单代码,以以下模式打印字符,
XXXXXXXXXX
XXXXXXXXX
XXXXXXXX
XXXXXXX
XXXXXX
XXXXX
XXXX
XXX
XX
X
这是代码,代码工作得很好
MOV AX, @DATA ; INITIALIZE DS
MOV DS, AX
; PRINT X
MOV CX,10
MOV BX,10
L2:
PUSH CX
MOV CX,BX
L1:
MOV DX, OFFSET HW ; LOAD THE STRING
MOV AH,09H
INT 21H
Loop L1
SUB BX,01
POP CX
MOV DX,0AH
MOV AH,02H
INT 21H
Loop L2
MOV AH, 4CH ; RETURN CONTROL TO DOS
INT 21H
但是,一旦我使用视频中断清屏,输出就会完全混乱,
这是输出,
XXXXXXXXXX
XXXXXXXXX
XXXXXXXX
XXXXXXX
XXXXXX
XXXXX
XXXX
XXX
XX
X
这是它的代码,
.MODEL SMALL
.STACK 100H
.DATA
HW DB "X$"
.CODE
MAIN PROC
MOV AX, @DATA ; INITIALIZE DS
MOV DS, AX
; CLEAR SCREEN
MOV AH, 06H
MOV AL, 00H
MOV CX, 00H
MOV DH, 25
MOV DL, 80
MOV BH, 0FH
INT 10H
; PRINT X
MOV CX,10
MOV BX,10
L2:
PUSH CX
MOV CX,BX
L1:
MOV DX, OFFSET HW ; LOAD THE STRING
MOV AH,09H
INT 21H
Loop L1
SUB BX,01
POP CX
MOV DX,0AH
MOV AH,02H
INT 21H
Loop L2
MOV AH, 4CH ; RETURN CONTROL TO DOS
INT 21H
MAIN ENDP
END MAIN
但是当我删除每次迭代后留下一行的换行符时,即
MOV DX,0AH
MOV AH,02H
INT 21H
输出符合预期,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我不明白清除屏幕代码与换行代码有什么关系?为什么他们互相搞砸了。 ?
当我使用光标位置设置代码而不是清除屏幕时,也会出现同样的问题,
MOV AH, 02H
MOV BH, 00H
MOV CX, 0000H
MOV DX, 0C22H
INT 10H
输出假设是我屏幕中间的以下内容,
XXXXXXXXXX
XXXXXXXXX
XXXXXXXX
XXXXXXX
XXXXXX
XXXXX
XXXX
XXX
XX
X
但显示如下,
XXXXXXXXXX
XXXXXXXXX
XXXXXXXX
XXXXXXX
XXXXXX
XXXXX
X
XX
XXX
XX
X
【问题讨论】:
-
你要求换行,你得到了换行。 0Dh控制字符为“回车”。
-
换行不等于转到下一行,即 \n ?
-
确实如此,直接向下。不,这不是 Unix 或 C。
-
那么它有什么问题,至少指出一下?
-
换行只是向上滚动页面,将插入符号(或“光标”)留在同一列。另一方面,回车将关心的内容移动到行首,但不会向上滚动页面。您需要组合这两个控制字符以向上滚动页面并将插入符号移动到行首,以任何顺序。这就是电传打字机在过去的工作方式。想象一台打印机打印出字符并被这些控制字符控制。