例1:编写一个程序,每行按大写字母顺序依次打印A-Z,每行 7个。

- 首先一共26个字母,所以需要一个计数器来计数26. (CX)
 - 其次每行输出七个字母,需要一个来记录每行的次数(BL)
 - 初始化一个DL,从A开始
 - 判断BL是否是7了,如果是7了就跳转,回车开始下一行
 - 二十六个字母输出完毕以后结束
 
.MODEL SMALL
.STACK 100H
.CODE
MAIN	PROC
 
	MOV	CX,26	;计数寄存器CX初始化26
	MOV	AH,2	;AH=2是显示输出
	MOV	DL,'A'	;初始化,待输出
	MOV	BL,0	;BL初始化0,BL用于每行输出的计次
@TOP:
	INT	21H	;输出
	INC	BL	;把BL的值加1
	CMP	BL,7	;把BL和7比较
	JL	@NEXT	;如果小于就跳转NEXT
	MOV	DH,DL	;把DL存储到DH,暂存
	
	MOV	DL,0DH
	INT	21H
	MOV	DL,0AH
	INT	21H	;回车换行
	MOV	DL,DH	;再把刚刚暂存的,存回来
	MOV	BL,0	;表示这一行输出完了准备输出下一行所以清空BL
@NEXT:
	INC	DL	;把DL加1,DL是待输出的 字母A-Z
	LOOP	@TOP	;CX减少1,如果CX不等于0就会一直循环TOP 
	MOV	AH,4CH
	INT	21H	;结束
MAIN	ENDP
	END	MAIN
例2:写一个程序,在输入的句子中,把小写字母的数量进行计数

- 键盘输入,注意是单个字符的输入所以每次输入以后就直接判断是否是小写字母然后给BL加1 用于计数,直到遇到回车0D
 - 如果不是就直接进入循环 不加一,如果是的话 加1以后循环
 - 输出的时候 要把BL先加30H,转换成ASCII再输出
 
.MODEL SMALL
.STACK 100H
.CODE
MAIN	PROC
	MOV	AH,2
	MOV	DL,'?'
	INT	21H	;输出问号
	MOV	BL,0	;记录小写字母数量
	MOV	AH,1
	INT	21H	;键盘输入
@WHILE:
	CMP	AL,0DH	;输入的和回车比较
	JE	@END_WHILE	;如果等于就跳转END_WHILE
	CMP	AL,'a'	;和a比较
	JL	@END_IF	;如果小于就跳转(大写字母和数字)
	CMP	AL,'z'	;和z比较
	JG	@END_IF	;如果大于就跳转(过滤掉其它符号)
	INC	BL	;把BL加一(小写字母的情况)
@END_IF:
	INT	21H	;键盘输入
	JMP	@WHILE	;继续循环
@END_WHILE:
	MOV	AH,2
	MOV	DL,0DH	
	INT	21H	
	MOV	DL,0AH
	INT	21H	;输出回车
	ADD	BL,30H	;变成ASCII码
	MOV	DL,BL	;存储到待输出DL里面
	INT	21H	;输出
	MOV	AH,4CH	;结束
	INT	21H
MAIN	ENDP
	END	MAIN
例3:在输入的句子中,统计非大写和小写(是数字符号)的数量

- 根据题目要求 需要排除掉大写和小写字母,那就是ASCII表里面的 小于A;小于a大于Z;大于z 的这些需要计数
 - 判断计数循环
 
.MODEL SMALL
.STACK 100H
.CODE
MAIN	PROC
	MOV	AH,2
	MOV	DL,'?'
	INT	21H	;输出问号
	MOV	BL,0	;记录数量
	MOV	AH,1	
	INT	21H	;键盘输入
@WHILE:
	CMP	AL,0DH	;判断是否回车
	JE	@END_WHILE	;如果等于回车就跳转END_WHILE
	
	CMP	AL,'A'	;如果小于A就跳转COUNT
	JL	@COUNT	;计数+1
	CMP	AL,'Z'	;如果小于或等于就跳转END_IF(全是大写字母)
	JLE	@END_IF
	CMP	AL,'a'	;如果是小于a,有一些符号
	JL	@COUNT	;计数+1
	CMP	AL,'z'	;如果小于等于z(全小写字母)
	JLE	@END_IF	
@COUNT:
	INC	BL	;BL=BL+1,计数+1
@END_IF:
	INT	21H	;继续键盘输入
	JMP	@WHILE	;继续循环判断
@END_WHILE:
	MOV	AH,2	;输出
	MOV	DL,0DH
	INT	21H
	MOV	DL,0AH
	INT	21H	;输出换行回车
	ADD	BL,30H	;计数BL 先加30H转换成ASCII码
	MOV	DL,BL	;存储到DL 待输出
	INT	21H	;输出
	MOV	AH,4CH
	INT	21H	;结束
MAIN	ENDP
	END	MAIN
	
例4:写一个程序,从输入的二进制数中计算1个数,然后打印出来。
假设1的个数小于10。

.MODEL SMALL
.STACK 100H
.CODE
MAIN	PROC
	MOV	AH,2
	MOV	DL,'?'
	INT	21H	;输出问号
	MOV	BL,0	;BL初始化0,用于计次
	MOV	AH,1
	INT	21H	;键盘输入
@WHILE:
	CMP	AL,0DH
	JE	@END_WHILE	;如果等于回车就跳转END_WHILE
	SUB	AL,30H	;把输入的数字减30,转换为真实数字
	JE	@NEXT	;如果小于就跳转NEXT
	INC	BL	;BL加一
@NEXT:
	INT	21H	;键盘输入
	JMP	@WHILE	;继续循环
@END_WHILE:
	MOV	AH,2
	MOV	DL,0DH
	INT	21H
	MOV	DL,0AH
	INT	21H	;输出回车换行
	MOV	DL,BL	;把BL的内容移到DL里,待输出
	ADD	DL,30H	;加30H转换成ASCII码准备输出
	INT	21H	;输出
	
	MOV	AH,4CH	;结束
	INT	21H
MAIN	ENDP
	END	MAIN
例5:编写一个计算并输出句子中单词数量的程序

.MODEL SMALL
.STACK 100H
.CODE
MAIN	PROC
	MOV	AH,2
	MOV	DL,'?'
	INT	21H	;输出问号
	MOV	BL,0	;计数BL初始化0
	MOV	BH,0	;BH初始化0
	MOV	AH,1	
	INT	21H	;键盘输入
@WHILE:
	CMP	AL,0DH	
	JE	@END_WHILE	;如果输入的是回车就跳转END_WHILE
	CMP	AL,' '	;如果输入的不是空格就SET_FLAG
	JNE	@SET_FLAG
	
	CMP	BH,0	;如果BH等于0跳转NO_COUNT
	JE	@NO_COUNT
	INC	BL	;BL=BL+1计数加一
	JMP	@NO_COUNT	;直接跳转NO_COUNT
@SET_FLAG:
	CMP	BH,1	;如果BH等于1就跳转NO_COUNT
	JE	@NO_COUNT
	MOV	BH,1	;让BH=1
@NO_COUNT:
	INT	21H	;键盘输入
	JMP	@WHILE	;继续循环
@END_WHILE:
	CMP	BH,0
	JE	@OUTPUT	;如果BH等于0就跳转OUTPUT
	INC	BL	;BL=BL+1计数加一
@OUTPUT:
	MOV	AH,2
	MOV	DL,0DH
	INT	21H
	MOV	DL,0AH
	INT	21H	;输出回车换行
	
	ADD	BL,30H	;计数加30H转换为ASCII
	MOV	DL,BL	;存储到待输出DL
	INT	21H	;输出
	MOV	AH,4CH	;结束
	INT	21H
MAIN	ENDP
	END	MAIN不太理解@SET_FLAG作用
1 条评论
[…] 汇编(20)五个例子 […]