小写到大写的程序在应该大写的时候没有大写

Lowercase to Uppercase program not capitalizing when it should

我正在编写一个汇编程序,将我输入的句子中每个单词的第一个字母大写。

我的问题是它没有将单词的首字母大写。我的代码有什么问题?

下面是我的代码

.model small
.stack 100h
.data
    prompt1 db "Input String: $"
    prompt2 db "Output String: $"
    InputString db 21,?,21 dup("$")  
    newline db 10,13,"$"
.code
start:
    mov ax, @data
    mov ds, ax

    ; Getting input string
    mov ah,09h
    lea dx, prompt1
    int 21h

    lea si, InputString
    mov ah, 0Ah
    mov dx, si
    int 21h

nextline: 
    mov ah, 09h
    lea dx, newline
    int 21h

loop1:   
    mov cl, [si+1]
    mov ch,0
    add si, cx
    inc si 
    dec cx
    cmp cx, 0
    je exit
    jmp checkspace

checkspace:
    cmp si, " "
    inc si
    je checkletter

checkletter:
    cmp si, "a"
    jae checkletter2

    checkletter2:
    cmp si, "z"
    jbe capital

capital:
    mov ah, [si]
    xor ah, 00100000b
    mov [si], ah
    jmp loop1  

exit:    
    mov ah,09h
    lea dx, prompt2
    int 21h

    mov ah, 09h
    mov dx, offset InputString+2
    int 21h   

    mov ah, 4ch
    int 21h
end start

下面是我的代码的更新部分。它现在只能将单词的第一个字母大写。不知道是不是循环的问题。请帮助我找出我的代码的哪一部分是错误的。很抱歉,我不知道如何使用调试器进行检查。谢谢。

    mov cl, [si+1]
    mov ch,0
    add si,2
    jmp checkletter

loop1:
    inc si
    dec cx
    cmp cx, 0
    je exit
    cmp si, " "
    je checkletter3
    jmp loop1

checkletter:
    cmp si, 41h
    jae checkletter2

checkletter2:
    cmp si, 5Ah
    jbe capital

checkletter3:
    inc si
    dec cx
    jmp checkletter

capital:
    mov ah, [si]
    xor ah, 00100000b
    mov [si], ah
    jmp loop1
cmp si, " "  
cmp si, "a"
cmp si, "z"
cmp si, 41h
cmp si, 5Ah

以上都是将SI中的地址与立即数进行比较。它们是 而不是 比较在 SI 指向的地址处可以找到的字节与立即数!您需要取消引用它。

cmp byte [si], " "
cmp byte [si], "a"
cmp byte [si], "z"
cmp byte [si], 41h
cmp byte [si], 5Ah

解决每个单词首字母大写的问题

  • 您首先需要找到每个单词的开头。这是通过跳过每个单词前面的空格来完成的。
  • 找到后,比较起始字符是否为小型大写字母,如果是,则通过减去 32 将其转换为大写字母。
  • 单词的其余部分再次被跳过,直到遇到行尾或找到另一个空白,该过程从顶部重新开始。

看起来像这样:

 mov  cl, [si+1]  
 test cl, cl           ;Exit if the input was empty!!!  
 jz   Exit  
 add  si, 2            ;Point at first byte  

SkipSpace:  
 mov  al, [si]  
 cmp  al, " "  
 jne  FirstCharacter  
 inc  si               ;(*)
 dec  cl
 jz   Exit
 jmp  SkipSpace

FirstCharacter:
 cmp  al, "a"
 jb   SkipRemainingCharacters
 cmp  al, "z"
 ja   SkipRemainingCharacters
 sub  al, 32           ;Capitalize
 mov  [si], al         ; and write back in string

SkipRemainingCharacters:
 inc  si
 dec  cl
 jz   Exit
 mov  al, [si]
 cmp  al, " "          ;If not space then it's part of same word
 jne  SkipRemainingCharacters
 jmp  SkipSpace        ;This could just as easily jump to (*)

Exit: