如何仅限制字母表中的显示字符

时间:2013-08-21 14:29:10

标签: assembly ascii alphabet

好吧,假设我有一个只接受字母的程序,无论它的大小写(大写或小写),转换并显示其相反的情况(例如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 

感谢您的回复!

2 个答案:

答案 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