例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)五个例子 […]