要求:键盘输入1~9,根据输入打印含有*的三角阵型,比如输入为3,第一行打印一个*,第二行打印3个*,第三行打印5个*,要求每行中间的*在同一列上。依此类推。
源程序:
DATA SEGMENT
STR DB 'INPUT NUMBER OF THE LINES(FROM 1 TO 9): ', '$'
ENDL DB 0AH, 0DH, '$'
LINE DB 01H ; 当前所在的行标号(初始化为1)
DATA ENDS
STACK SEGMENT PARA STACK
DW 20H DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
BEGIN: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET STR
MOV AH, 09H
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 31H ; 检测无效输入
JB OVER
CMP AL, 39H
JA OVER
AND AH, 00H
AND AL, 0FH
MOV CX, AX ; 外层循环次数置入CX
LOP1: PUSH CX ; 外层循环次数暂存入堆栈
MOV DX, OFFSET ENDL ; 打印回车换行
MOV AH, 09H
INT 21H
MOV BL, 00H ; 控制参数(控制每行'*'的个数)
SUB CX, 01H ; 内层循环,每行的要打印的'空格'数比当前的CX值少1
CMP CX, 0 ; 若CX已经为0,则直接打印'*'
JE LOP3
LOP2: MOV DL, ' '
MOV AH, 02H
INT 21H
LOOP LOP2
LOP3: MOV DL, '*'
MOV AH, 02H
INT 21H
INC BL ; 统计个数加1
AND AL, 00H ; 每行'*'的个数 = 当前行号 * 2 - 1
MOV AL, LINE
ADD AL, AL
DEC AL
CMP BL, AL ; 判断'*'的个数是否符合要求
JE NEXT
LOOP LOP3
NEXT: ADD LINE, 01H ; 行号加1
POP CX ; 外层循环次数弹出
LOOP LOP1
OVER: MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN