题目要求
输入3-9之间的一个数n,输出一个由“ * ”组成的口字形。例如输入5,则输出:
* * * * *
* *
* *
* *
* * * * *
输入不在3-9范围内的数字要报错!
运行截图
编程平台
Masm for Windows 集成实验环境 2012.5
代码实现
DATAS SEGMENT
hint DB 'Enter a digit between 3-9: $'
error DB 'The input is not in the required scope!$'
break DB 13,10,'$'
DATAS ENDS
STACKS SEGMENT STACK
DB 200H DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,hint;输入提示
MOV AH,9H
INT 21H
;只接收一个字符
MOV AH,1H;输入一个字符
INT 21H
MOV CL,AL;CL存储输入的字符
LEA DX,break;换行
MOV AH,9H
INT 21H
;检查输入的内容是否符合要求
SUB CL,30H;;将数字样式不变地转换成十六进制,如输入3则转换成3H
CMP CL,3
JB err
CMP CL,9
JG err
;外循环CL个行,内循环CL个列
MOV CH,0
MOV SI,0;外循环标志
outlop:
CMP SI,CX
JE finish;外循环结束
MOV DI,0;内循环标志
inlop:
CMP DI,CX
JE next;内循环结束
CMP SI,0;是否为第一行,第一行要有CL个*
JE asterisk
MOV BX,SI
INC BX
CMP BX,CX;是否为最后一行,最后一行要有CL个*
JE asterisk
CMP DI,0;是否为第一列,第一列一定有*
JE asterisk
MOV BX,DI
INC BX
CMP BX,CX;是否为最后一列,最后一列一定有*
JE asterisk
MOV DL,' ';不用输出*的地方用空格代替
MOV AH,2H
INT 21H
JMP space
asterisk:;输出*符号
MOV DL,'*'
MOV AH,2H
INT 21H
space:;输出两个空格隔开*符号
MOV DL,' '
MOV AH,2H
INT 21H
MOV DL,' '
MOV AH,2H
INT 21H
INC DI
JMP inlop
next:
LEA DX,break;换行
MOV AH,9H
INT 21H
INC SI
JMP outlop
err:
LEA DX,error;出错提示
MOV AH,9H
INT 21H
finish:
MOV AH,4CH
INT 21H
CODES ENDS
END START
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!