汇编作业(2006.5.9)

要求:键盘输入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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值