问题描述
编程由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上。
设计思路
首先,先把输入的字符存储到char中,然后再先后取char的高低位(实际是取的AX,char不动),依次输出,即先输出高位,后输出低位。在输出时,如果是0~9,应加上30H(因为0~9的ASCII码对应的是30H~39H);如果是字母,则要加上7(因为第一个字母A的ASCII码是41H,与0AH相差37H)
实现代码
DATA SEGMENT
welcome DB 'Please enter a character:',0DH, 0AH, 24H ; 提示输入一个字符(0DH、0AH表示回车换行,24H表示'$'[代表字符串结尾])
bingo DB 'Its ASCII is:', 24H ; 提示输出的ASCII码结果
Change_Row DB 0DH, 0AH, 24H ; 用来换行
char DB ? ; 用来存储要输入的字符
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
; 初始化
MOV AX, DATA
MOV DS, AX
; 提示字符串输入:
MOV DX, OFFSET welcome ; 将welcome的地址赋值给DX
MOV AH, 09H ; 字符串的输出
INT 21H
; 从键盘中读取一个字符(字符的输入,输入的字符读到AL中)
MOV AH, 01H
INT 21H
MOV char, AL ; 将输入的字符存入char中
; 输出换行
MOV DX, OFFSET Change_Row
MOV AH, 9
INT 21H
; 提示字符串输出
MOV DX, OFFSET bingo
MOV AH, 9
INT 21H
AND AL, 0F0H ; 取AL的高位(这里必须在F0H前加0。因为表示十六进制时,字母不能直接放在最前面,如:表示十六进制的10时,应该是0AH,而不是AH)
MOV CL, 4
SHR AL, CL ; 逻辑右移,将AL的高位变为低位
CMP AL, 0AH ; 将该数与A作比较
JB C2 ; 如果它比A小(表示数字),则直接跳转至C2
ADD AL, 7 ; 否则(表示字母)要先加上7
C2:
ADD AL, 30H ; 将它转换为ASCII码
; 单个字节DL的输出(先输出char的高位)
MOV DL, AL
MOV AH, 2
INT 21H
MOV AL, char ; 重新载入输入的字符char
AND AL, 0FH ; 取AL的低位
CMP AL, 0AH ; 将该数与A作比较
JB DISP ; 如果比A小(表示数字),则跳转至DISP
ADD AL, 7 ; 否则(表示字母)要先加上7
DISP:
ADD AL, 30H ; 将它转换为ASCII码
; 单个字节DL的输出(再输出char的低位)
MOV DL, AL
MOV AH, 2
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START
运行结果展示
数字的输入:
大写字母的输入:
小写字母的输入:
其他
当然,这个算法的设计思路也不是唯一的。在输出时,也可以用LOOP指令结合移位进行循环输出,可参考博主的这篇文章:汇编语言-数据区十进制数转十六进制输出
另外,这里的任意字符并不是真正意义上的任意,只能达到数字、字母等的输入转换为ASCII码形式输出。