方法一:
运行效果:
输入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 ENDSSTACKS SEGMENT ;堆栈段
STACKS ENDSCODES SEGMENT ;代码段ASSUME CS:CODES,DS:DATAS,SS:STACKS ;设置段寄存器 代码段寄存器CS:CODES 数据段寄存器DS:DATAS 堆栈段寄存器SS:STACKSSTART: ;程序入口MOV AX,DATAS ;设置数据段MOV DS,AXMOV AH,07H ;输入无回显 是指在输入字符时,字符不会在屏幕上显示出来INT 21H ;中断 AL=输入字符SUB AL,1 ;将输入的字符减1,得到其前导字符MOV DL,AL ;将前导字符存入DLMOV AH,02H ;输出前导字符INT 21H ;中断 DL=输出字符ADD AL,1 ;将输入的字符加1,得到中间字符MOV DL,AL ;将中间字符存入DLMOV AH,02H ;输出中间字符INT 21H ;中断 DL=输出字符ADD AL,1 ;将输入的字符加1,得到其后续字符MOV DL,AL ;将后续字符存入DLMOV 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 SEGMENTSTRING DB 'zabcdefghijklmnopqrstuvwxyza'CRLF DB 0AH,0DH,'$' ;回车换行符
DATA ENDSSTACK SEGMENT PARA STACKDW 128 DUP(?) ;定义栈段TOP LABEL WORD ;栈顶指针
STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK ;设置栈段MOV SS,AX ;设置栈顶指针LEA SP,TOP ;设置栈顶MOV AH,1 ;读入一个字符INT 21H LEA DI,STRING ;把STRING的地址放到DIL1: INC DI ;INC:+1,指向字符串的第一个字符 ,‘z’CMP AL,[DI] ;比较当前字符和字符串的第一个字符JNE L1 ;如果不相等,则继续比较下一个字符DEC DI ;如果相等,DEC:-1,指向前导字符MOV AH,9 ;显示字符串LEA DX,CRLF ;显示回车换行符INT 21HMOV CX,3 ;设置循环次数L2: MOV DL,[DI] ;把字符串的字符放到DLMOV AH,2 ;显示字符INT 21HINC DI ;指向下一个字符LOOP L2 ;循环CX次MOV AH,4CH ;退出程序INT 21H
CODE ENDSEND START