我有一个任务,描述如下:
- Reads printable characters (20h-7Fh) from the keyboard without echoing
- Uppercase letters are printed to display
- Lowercase letters are converted to uppercase and then printed to display
- Blank spaces and periods are printed to display; everything else is trashed
- Program ends when period is printed
到目前为止,我的程序如下:
.model small
.8086
.data
.code
start:
mov ax,@data
mov ds,ax
read:
mov ah,8
int 21h
cmp al,61
jl write
cmp al,7fh
jg read
sub al,20h
jmp write
write: cmp al,20h
jl read
mov dl,al
mov ah,2
int 21h
cmp dl,2eh
jne read
exit:
mov ax,4c00h
int 21h
end start
我的程序成功将小写字母转换为对应的大写字母并打印出来,但我无法过滤掉其他字符。如何最好地只允许空格、句号和字母通过显示?
看ASCII表,
21h - 2Dh can be trashed
2Fh - 40h can be trashed
5bh - 60h can be trashed
7bh - 7fh can be trashed
有人能帮我想出最佳逻辑来比较这些值的输入,然后丢弃掉那些在上述范围内的值吗?我们的评分标准是效率,编写0-20条指令将被授予满分。我已经写了20条指令,在这里我还没有包括找到垃圾值的比较。
编辑
这是我缩小代码范围后得到的结果:
.model small
.8086
.data
.code
read:
mov ah,8
int 21h
cmp al,' '
je write
cmp al,'.'
je write
cmp al,'a'
jl read
cmp al,'Z'
jg convert
convert:
cmp al,'a'
jl read
sub al,20h
write:
mov dl,al
mov ah,2
int 21h
cmp dl,'.'
jne read
exit:
mov ax, 4c00h
int 21h
end read
目前有21条指令!我的代码中是否有重复的部分可以去掉,以达到20条指令呢?
ds
的指令)。此外,int 20h
将会在不需要先设置ax
寄存器的情况下退出你的程序。 - Greg Hewgillcmp al,'a'
比您目前写的更易读且有意义。 - wallyk