好吧,假设我有一个只接受字母的程序,无论它的大小写(大写或小写),转换并显示其相反的情况(例如A到a,a到A)。程序然后通过升序和降序显示下一个字母,但仅在字母表中显示。
例如,如果我输入' l'并选择升序,它将输出相应的大写等价以及之后的下一个字母,直到Z.
Input: l
Display
[a]ascending
[d]descending
Choice:a
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
同样如果我输入E并选择降序,它将输出相应的小写等价以及之前的下一个字母,直到a。
Input:E
Display
[a]ascending
[d]descending
Choice:d
e
d
c
b
a
这是我到目前为止完成的一段代码,我已经设法将输入字母转换为大写和小写的等价物,并且还能够垂直显示它们。我唯一的问题是如何将输出限制为字母表。
startOver:
call cls
mov ah,9
lea dx,string8 ;Display the string "Input:"
int 21h
mov ah,1 ;input starting letter
int 21h
mov bl,al
call nlcr ;nlcr is a procedure for new line and carriage return
mov ah,9
lea dx,string9 ;Display the string "Display"
int 21h
call nlcr
mov ah,9
lea dx,string10 ;Display the string "[a]ascending"
int 21h
call nlcr
mov ah,9
lea dx,string11 ;Display the string "[d]descending"
int 21h
call nlcr ;nlcr is a procedure for newline and carriage return
mov ah,9 ;Display the string "Choice:"
lea dx,string12
int 21h
mov ah,1 ;input display choice if it's ascending or descending
int 21h
mov cl,al
call nlcr
cmp cl,'a' ;validate the display choice
je ascending
cmp cl,'d'
je descending
checkd:
cmp cl,'d'
je descending
cmp cl,'d'
mov ah,9
lea dx,string14
int 21h
jne startOver
ascending: ;display in ascending order
xor bl,20h ;converts letter to uppercase or lowercase
mov ah,2
mov dl,bl
int 21h
mov cx,15 ;display the letters vertically, I put a default of 15 for I am not sure how to limit it to the alphabet only
asc:
mov bl,dl
call nlcr
mov dl,bl
inc dl
int 21h
loop asc
jmp exit
descending: ;display in descending order
xor bl,20h ;converts letter to uppercase or lowercase
mov ah,2
mov dl,bl
int 21h
mov cx,15
desc:
mov bl,dl
call nlcr
mov dl,bl
dec dl
int 21h
loop desc
jmp exit
exit:
;call cls
mov ah,4ch
int 21h
main endp
感谢您的回复!
答案 0 :(得分:1)
我唯一的问题是如何将输出限制为字母表。
就像任何其他语言一样:每个字符您可以进行范围检查(一个或多个)或查找表(可能使用范围检查或少数建立)。 ASCII只需处理一个字节,因此表中有256个条目,如果每个条目一个字节就会有256个字节,因此根本不需要处理大表,易于生成且易于使用。
如果使用ascii(知道大写和小写是分开的),你循环直到它没有通过字母表测试,然后将它备份26或27,然后继续直到你点击开始字符。
你也可以玩一些小游戏,我相信大写和小写相差一位,如果msbit为0则强制该位并进行单一范围检查以确定它是否在字母表内。不如查找表快,但比两个或更多范围检查更快。
答案 1 :(得分:0)
我会把它改成这样的东西:
asc:
mov bl,dl
call nlcr
mov dl,bl
inc dl
int 21h
and bl,0DFh ; make sure bl is upper case
cmp bl,'Z'
jb asc ; loop until the next character would be 'z'+1 or 'Z'+1
jmp exit
同样按降序排列;除非您与'A'
进行比较,否则请使用ja
代替jb
。