1

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

感谢您的回复!

4

2 回答 2

1

我唯一的问题是如何将输出仅限于字母表。

就像任何其他语言一样:对于每个字符,您要么进行范围检查(一个或多个),要么进行查找表(可能使用范围检查或少量构建)。ASCII 你只需要处理一个字节,所以一个表中有 256 个条目,如果你每个条目处理一个字节,则为 256 个字节,这样根本就不是一个要处理的大表,易于生成且易于使用。

如果使用 ascii(知道大写和小写是分开的),则循环直到它未通过字母测试,然后将其备份到 26 或 27,然后继续直到您点击开始字符。

您也可以玩一些位游戏,我相信上限和下限相差一位,如果 msbit 为 0,则强制该位并进行单个范围检查以确定它是否在字母表内。不如查找表快,但比两个或更多范围检查快。

于 2013-08-21T17:12:34.643 回答
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

降序也是如此;execpt 然后你会比较'A'并使用ja而不是jb.

于 2013-08-21T14:41:35.330 回答