题目要求
将从键盘输入ASCII字符用二进制数显示,要求能连续输入,按下ESC键时退出。且要求只能输入大写字母,否则提示重新输入。
代码设计
根据A-Z的ASCII码作为判断依据,并进行相应的跳转。如果不在范围内,则提醒错误原因并重新输入。为了实现连续输入,本程序采用循环跳转的方式进行。如果输入在A-Z范围内,则进行八次循环,获取该字符在二进制ASCII码中的每一位的值。为了方便输出,ASCII码从最高位进行输出。
以ESC的ASCII码作为结束标志。
运行结果
代码
DATAS SEGMENT
;此处输入数据段代码
CRLF DB 0AH,0DH,"$";回车换行
msg db 'not a powercase,input again', 0dh, 0ah, '$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
again1:
mov ah,1
int 21h
cmp al, 1bh ;ESC的ASCII码是1bh
je done
cmp al, 41h
jl once_again
cmp al, 5Ah
ja once_again
jmp convert
convert:
mov bl,al
mov ah,2
mov dl,':'
int 21h
mov cx,8 ;CX←8(循环次数)
again:
shl bl,1 ;左移进CF,从高位开始显示
mov dl,0 ;MOV指令不改变CF
adc dl,30h ;DL←0+30H+CF
;CF若是0,则DL←‘ 0 ’的ASCII码
;CF若是1,则DL←' 1 '的ASCII码
mov ah,2
int 21h ;显示dl中字符
loop again ;CX减1,如果CX未减至0,则循环
MOV DL,0AH
MOV AH,2
INT 21H ;前三行代码表示输出'换行'
loop again1
once_again:
lea dx,crlf ;换行
mov ah,9
int 21h
mov dx,offset msg ;提示
mov ah,9
int 21h
jmp again1
done: MOV AH,4CH
INT 21H
CODES ENDS
END START