例1:输入一个数字,输出这个数字和这个数字+1后的数字

  • 先输出一个问号,用到 ah 2 显示输出
  • 键盘输入并回显,用到AH1,此时用户输入的内容存放到AL里了
  • 输出一个回车换行,但是因为会破坏掉AL的值,所以先把AL的值存到BL去
  • 把BL的值放回DL并输出
  • 把DL的值加1,并输出

代码如下:

.MODEL SMALL
.STACK 100H
.CODE


MAIN	PROC
	MOV	AH,2	;显示输出
	MOV	DL,'?'
	INT	21H

	MOV	AH,1	;键盘输入并回显,AL=输入字符
	INT	21H

	MOV	BL,AL	;把刚刚键盘输入的内容存放到BL里

	MOV	AH,2	;显示输出  
	MOV	DL,0DH	;显示输出 回车键
	INT	21H
	MOV	DL,0AH	;显示输出 换行键
	INT	21H

	MOV	DL,BL	;把之前键盘输入的内容存放到DL里
	INT	21H	;输出

	INC	DL	;把目标操作数DL的值加1
	INT	21H	;输出

	MOV	AH,4CH
	INT	21H
MAIN	ENDP
	END	MAIN




例2:把一个大写字母转换成小写字母

首先观察一下ASCII编码表http://www.yuofyou.cn/20200329/158.html

我们随意挑2组大小写字母来比较

二进制十进制十六进制字符/缩写
01001101774DM
011011011096Dm
010100018151Q
0111000111371q

我们发现大小写字母的十进制相差32,十六进制相差20(你可以拿计算器算算)

于是我们可以得到一个结论,大写字母加32或者加20H就可以转换为小写字母

  • 显示输出问号
  • 键盘输入,输入的内容会存储到AL里,然后把AL的内容存储到BL(因为之后会破坏AL的内容所以需要提前备份)
  • 显示输出回车换行符
  • 把之前输入的字母加20H或者加32
  • 输出

代码如下:

.MODEL SMALL
.STACK 100H
.CODE
MAIN 	PROC
	MOV	AH,2
	MOV	DL,'?'	;显示输出
	INT	21H

	MOV	AH,1	;键盘输入并回显,输入的内容存到AL
	INT	21H

	MOV	BL,AL	;把输入的内容AL存到BL

	MOV	AH,2	;显示输出
	MOV	DL,0DH	;回车
	INT	21H
	MOV	DL,0AH	;换行符
	INT	21H

	ADD	BL,20H
	MOV	DL,BL
	INT	21H	;输出结果

	MOV 	AH,4CH 	
	INT 	21H
MAIN	ENDP
	END 	MAIN
 




例3:输入三个字,把它们的顺序反过来

  • 输出问号
  • 输入并回显第一个字母,并把字母存储到BL里
  • 输入并回显第二个字母,并把字母存储到BH里
  • 输入并回显第三个字母,并把字母存储到CL里
  • 显示输出回车
  • 依次输出CL BH BL的值 就反过来了

*只要有INT 21H,那肯定是执行了一个DOS系统功能,这个功能号是前面一个AH的值

.MODEL	SMALL
.STACK	100H
.CODE

MAIN	PROC
	MOV	AH,2
	MOV	DL,'?'
	INT	21H	;输出问号

	MOV	AH,1
	INT	21H	;输入并回显 (第一个字母)
	MOV	BL,AL	;把第一个字母存储到BL里

	INT	21H	;此时功能号还是为1,继续输入并回显(第二个字母)
	MOV	BH,AL	;把第二个字母存储到BH里

	INT	21H	;此时功能号还是为1,继续输入并回显(第三个字母)
	MOV	CL,AL	;把第三个字母存储到CL里

	MOV	AH,2	;功能号更改为2 显示输出

	MOV	DL,0DH
	INT	21H
	MOV	DL,0AH
	INT	21H	;回车

	MOV	DL,CL	;把第三个字母存储到DL 并输出
	INT	21H	

	MOV	DL,BH	;把第二个字母存储到DL里
	INT	21H

	MOV	DL,BL	;把第一个字母存储到DL里
	INT	21H

	MOV	AH,4CH
	INT	21H
MAIN	ENDP
	END	MAIN




例4:输入一个大写字母,显示它本身和它的小写字母

  • 定义数据段,四个分别是让用户输入字母的提示语 和输出字母的提示语还有两个存储用户输入的值和转换后的小写字母的数据
  • 输出让用户输入字母的提示语
  • 键盘输入 并把输入的存储到UCHAR
  • 把UCHAR的存到AL,然后把AL加20H转换为小写字母(见例2)把结果存储到LCHAR
  • 显示结果

.MODEL	SMALL
.STACK	100H
.DATA
;定义数据段
IN_MSG	DB 'Enter an upper case letter:$'
OUT_MSG DB 0DH,0AH,'The upper and lower case letters:'
UCHAR	DB ?,' '
LCHAR	DB ?,'$'


.CODE
MAIN	PROC

	MOV	AX,@DATA	;把DATA首地址传送到AX里,AX只是用来中转
	MOV	DS,AX	;把DATA首地址传送到DS里
	LEA	DX,IN_MSG	;取IN_MSG的偏移地址,保存到DX里


	MOV	AH,9	;9=显示字符串,IN_MSG的内容
	INT	21H

	MOV	AH,1	;1=键盘输入并回显
	INT	21H

	MOV	UCHAR,AL		
;把刚刚输入的内容存储到UCHAR字符串里面

	ADD	AL,20H	;ASCII值加20H就是转换成小写,看例2
	MOV	LCHAR,AL	;把AL(小写字母)存储到LCHAR里面

	LEA	DX,OUT_MSG	;取OUT_MSG的偏移地址,存储到DX里

	MOV	AH,9	;9=显示字符串
	INT	21H
;此时会按照数据段里面的OUT_MSG的值显示,然后UCHAR的值显示,最后LCHAR的值显示,遇到$的时候才会停止


	MOV	AH,4CH
	INT	21H
MAIN	ENDP
	END	MAIN




例5:输入一个0-9的数,这个数到10还差几,(x-10的绝对值)

.MODEL SMALL
.STACK 100H
.CODE

MAIN	PROC
	MOV	AH,2
	MOV	DL,'?'
	INT	21H	;输出问号

	MOV	AH,1	
	INT	21H	;输入并回显

	SUB	AL,30H	;把ASCII码转真实数值
	NEG	AL	;NEG指令把操作数按位取反,也就是取相反数

	ADD	AL,10	;加10
	MOV	BL,AL	;把AL的值存储到BL里


	MOV	AH,2	;显示输出
	MOV	DL,0DH
	INT	21H
	MOV	DL,0AH
	INT	21H	;回车换行

	MOV	DL,BL	;把BL的值存储到DL
	ADD	DL,30H	;把真实的数值转回ASCII码
	INT	21H	;输出
	
	MOV	AH,4CH
	INT	21H
MAIN	ENDP
	END	MAIN

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏