方法一:
运行效果:
输入B,输出显示ABC;输入A,输出显示@AB
思路:
1、通过键盘输入接收一个字母。
2、将输入的字母减去1,得到前导字符,然后输出。
3、将输入的字母加上1,得到中间字符,然后输出。
4、将输入的字母加上1,得到后续字符,然后输出。
通过MOV AH,07H调用中断接收输入字符,之后输入的字符就存储在AL中,只需要对AL进行操作就可以了。
Tips: MOV AH 01H 和 MOV AH 07H的区别:
MOV AH 01H:按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符。
MOV AH 07H:按下任何键,将其对应字符的ASCII码送入AL中,不在屏幕上显示该字符。
使用MOV AH 01H的效果:
使用MOV AH 07H的效果:(本博客使用的是07H)
两者均是从键盘接收字符并存入AL中,只是显示的区别。
代码如下:
DATAS SEGMENT ;数据段
DATAS ENDS
STACKS SEGMENT ;堆栈段
STACKS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS,SS:STACKS ;设置段寄存器 代码段寄存器CS:CODES 数据段寄存器DS:DATAS 堆栈段寄存器SS:STACKS
START: ;程序入口
MOV AX,DATAS ;设置数据段
MOV DS,AX
MOV AH,07H ;输入无回显 是指在输入字符时,字符不会在屏幕上显示出来
INT 21H ;中断 AL=输入字符
SUB AL,1 ;将输入的字符减1,得到其前导字符
MOV DL,AL ;将前导字符存入DL
MOV AH,02H ;输出前导字符
INT 21H ;中断 DL=输出字符
ADD AL,1 ;将输入的字符加1,得到中间字符
MOV DL,AL ;将中间字符存入DL
MOV AH,02H ;输出中间字符
INT 21H ;中断 DL=输出字符
ADD AL,1 ;将输入的字符加1,得到其后续字符
MOV DL,AL ;将后续字符存入DL
MOV AH,02H ;输出后续字符
INT 21H ;中断 DL=输出字符
MOV AH,4CH ;结束程序
INT 21H ;中断 0=结束程序
CODES ENDS ;代码段结束
END START ;程序结束
在上述代码中,我们可以总结出输出一个字符的固定格式:
MOV DL,要显示的字符现在所存入的寄存器(例如本例中是AL)
MOV AH,02H
INT 21H
方法二:
从方法一中我们看出,当输出的字母是A时,打印出来的三个连续字符是“@AB”,这是因为A的ascll码前一位是“@”,如何实现当输出的字母是A时,打印出来的三个连续字符是“ZAB”呢?运行效果如下所示:
思路:
1、定义一组字符串,让'a','z'首尾相接,'zabcdefghijklmnopqrstuvwxyza'
2、接收用户从键盘输入的字母,将输入字母与字符串的字母进行比较。
3、如果字符不相等,则继续循环直到找到匹配的字符;找到匹配字符后,通过DEC指令将当前所在字符串的位置减1,以便指向输入字符的前导字符,输出;再加1,找到中间字符,输出;再加1,找到后续字符,输出。
代码如下:
DATA SEGMENT
STRING DB 'zabcdefghijklmnopqrstuvwxyza'
CRLF DB 0AH,0DH,'$' ;回车换行符
DATA ENDS
STACK SEGMENT PARA STACK
DW 128 DUP(?) ;定义栈段
TOP LABEL WORD ;栈顶指针
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK ;设置栈段
MOV SS,AX ;设置栈顶指针
LEA SP,TOP ;设置栈顶
MOV AH,1 ;读入一个字符
INT 21H
LEA DI,STRING ;把STRING的地址放到DI
L1: INC DI ;INC:+1,指向字符串的第一个字符 ,‘z’
CMP AL,[DI] ;比较当前字符和字符串的第一个字符
JNE L1 ;如果不相等,则继续比较下一个字符
DEC DI ;如果相等,DEC:-1,指向前导字符
MOV AH,9 ;显示字符串
LEA DX,CRLF ;显示回车换行符
INT 21H
MOV CX,3 ;设置循环次数
L2: MOV DL,[DI] ;把字符串的字符放到DL
MOV AH,2 ;显示字符
INT 21H
INC DI ;指向下一个字符
LOOP L2 ;循环CX次
MOV AH,4CH ;退出程序
INT 21H
CODE ENDS
END START