该程序涉及到双重循环,这里考察到循环时对CX寄存器的压栈以及出栈,首先写出外部循环,并对CX寄存器赋值之后,写出相应的操作,当写内部循环的时候,也是需要为CX寄存器赋值,如果不进行保护,则会覆盖外部循环的CX寄存器的值,这里就需要保护外部循环的相关数据(这里相关数据的意思就是外部循环中用到的寄存器的内容,在内部循环之中也有用到),所以要通过PUSH压进栈保护起来,例如,PUSH CX ,则可以对CX寄存器重新赋值,书写到内部循环之中,当内部循环结束之后,POP CX,将保护的CX寄存器的值弹出栈,这里的CX寄存器中的值,就是之前保护起来之前的值,运用PUSH,POP指令值书写多重循环的关键
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,0000H ;将DX,CX初始化
MOV CX,0000H
MOV DL,10H ;打印从10H到FFH的ASCII码(保存第一个要打印的ASCII码)
MOV CX,000FH ;外层循环(行数)
LOOP_WAI:
PUSH CX ;保存外循环的次数
MOV CX,0010H ;内层循环次数,就是列数
MOV AH,02H
LOOP_NEI:
INT 21H ;打印ascll
PUSH DX ;这里为了美观打印空格,要为DL赋值,则需要将DX内容保护起来
MOV DL,00H
INT 21H ;输出空格
POP DX
INC DX ;使DX的内容自加1
LOOP LOOP_NEI
;此时这里已经进行完一次内循环
POP CX ;弹出之前保存起来的外部循环的次数
PUSH DX ;保存DX,因为要打印出换行
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
POP DX ;打印完毕之后弹出保护起来得DX
LOOP LOOP_WAI
MOV AH,4CH
INT 21H
CODES ENDS
END START
上述源代码中注释已经清楚了,希望对你有所帮助
这就是运行结果: