例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组大小写字母来比较
二进制 | 十进制 | 十六进制 | 字符/缩写 |
01001101 | 77 | 4D | M |
01101101 | 109 | 6D | m |
01010001 | 81 | 51 | Q |
01110001 | 113 | 71 | q |
我们发现大小写字母的十进制相差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
1 条评论
[…] 汇编-几个输入输出例子 […]