我似乎找不到一种方法来给我的程序添加元音计数器。程序必须使用Irvine32.inc才能有效。
INCLUDE Irvine32.inc
ExitProcess PROTO, dwExitCode:DWORD
.data
msg1 BYTE "Enter any string of your choice: ",0
msg2 BYTE "The number of words in the input string is: ",0
msg3 BYTE "The output string is: ",0
string BYTE 50 dup(?)
vowelc BYTE ?
.CODE
main PROC
mov edx,offset msg1 ;;PROMPT FOR STRING
call writestring
mov ecx,50
mov edx,offset string ;;LOAD THE ADDRESS OF THE STRING
call readstring ;;READ STRING
call crlf ;;NEWLINE
lea esi,string ;;STARTING ADDRESS OF THE STRING INTO ESI
repeet:
mov al,[esi] ;;LOAD ONE CHARACTER INTO AL
cmp al,0 ;;CHECK AL==0?
je eos ;;IF AL==0, GOTO EOS BECAUSE IT SAYS END OF STRING
cmp al,20h ;;CHECK AL==20?
jne ahead ;;IF AL IS NOT SPACE GOTO AHEAD
jmp nochange ;;JUMP TO NOCHANGE
ahead:
cmp al,61h ;;CHECK AL==61? IF LOWER LIMIT OF LOWER CASE
jl checklimit ;;IF THE CHAR IS < 61, IT CAN BE A CAPITAL LETTER OR SOME OTHER CHAR. HENCE GOTO CHECKLIMIT
cmp al,7ah ;;CHECK AL==7A?
jg nochange ;;IF ANY OTHER CHAR, MAKE NO CHANGE
sub al,20h ;;CONVERT LOWERCASE TO UPPERCASE
mov [esi],al ;;SAVE TO STRING
jmp nochange ;;GOTO NOCHNAGE
checklimit:
cmp al,5ah ;;CHECK AL==5A?
jg nochange ;;IF CHAR > Z, MAKE NO CHANGE
cmp al,41h ;;CHECK AL==41?
jl nochange ;;IF CHAR < A, MAKE NO CHANGE
add al,20h ;;IF CHAR IS FROM A - Z,CONVERT IT TO LOWERCASE
mov [esi],al ;;STORE IT TO STRING
nochange:
inc esi ;;INCREMENT ESI TO GET NEXT CHAR
jmp repeet ;;REPEAT TILL END OF THE STRING
eos:
mov edi, OFFSET string
mov al,'A'
mov ecx, LENGTHOF string
mov edx,offset msg3 ;;DISPLAY PROMPT3 MESSAGE
call writestring
mov edx,offset string ;;DISPLAY CHANGED STRING
call writestring
call crlf
INVOKE ExitProcess, 0 ;;EXIT
main ENDP
END MAIN
不知何故,我必须找到一种方法来添加一个元音计数器到这个程序,而不搞砸任何事情,但我不知道如何。
我试着在我的书中寻找选项,但我找不到任何相关的代码。
我也试着在其他网站上寻找信息,但似乎没有人能帮助我。
1条答案
按热度按时间7uhlpewt1#
在现有的程序中有两个地方(* 显然你想继续工作 *),你可以在那里存储一个大小写转换回字符串的字母字符,在那里你可以测试元音,并可能增加计数器。
仔细选择正确的位置,允许编写一个 IsVowel 代码,只需处理大写字符:
现有的代码可以改进很多。例如,不要在ASCII码的字节上使用带符号的条件。两种字符的大小写可以一起检测,并使用
xor al, 32
切换。