汇编语言:根据输入的数值输出一个由“ * ”组成的口字形

汇编语言:根据输入的数值输出一个由“ * ”组成的口字形

  • 题目要求
      • 运行截图
  • 编程平台
  • 代码实现

题目要求

输入3-9之间的一个数n,输出一个由“ * ”组成的口字形。例如输入5,则输出:
*        *        *        *        *
*                                    *
*                                    *
*                                    *
*        *        *        *        *
输入不在3-9范围内的数字要报错!

运行截图

汇编语言:根据输入的数值输出一个由“ * ”组成的口字形_第1张图片
汇编语言:根据输入的数值输出一个由“ * ”组成的口字形_第2张图片

编程平台

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

如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!

你可能感兴趣的:(汇编语言)