汇编语言-显示任意输入字符的ASCII码

问题描述

        编程由键盘输入任意一个字符,将该字符的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码形式输出。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值