assembly 在汇编程序中添加元音计数器

bkhjykvo  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(97)

我似乎找不到一种方法来给我的程序添加元音计数器。程序必须使用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

不知何故,我必须找到一种方法来添加一个元音计数器到这个程序,而不搞砸任何事情,但我不知道如何。
我试着在我的书中寻找选项,但我找不到任何相关的代码。
我也试着在其他网站上寻找信息,但似乎没有人能帮助我。

7uhlpewt

7uhlpewt1#

sub al,20h      ;;CONVERT LOWERCASE TO UPPERCASE
mov [esi],al    ;;SAVE TO STRING
...
add al,20h      ;;IF CHAR IS FROM A - Z,CONVERT IT TO LOWERCASE
mov [esi],al    ;;STORE IT TO STRING

在现有的程序中有两个地方(* 显然你想继续工作 *),你可以在那里存储一个大小写转换回字符串的字母字符,在那里你可以测试元音,并可能增加计数器。

sub  al, 20h       ; UCase
mov  [esi], al
call IsVowel       ; After converting to uppercase
...
call IsVowel       ; Before converting to lowercase
add  al, 20h       ; LCase
mov  [esi], al

仔细选择正确的位置,允许编写一个 IsVowel 代码,只需处理大写字符:

IsVowel:
  cmp  al, 'A'
  je   Yes
  ...
  cmp  al, 'U'
  jne  No
Yes:
  inc  vowelc
No:
  ret

现有的代码可以改进很多。例如,不要在ASCII码的字节上使用带符号的条件。两种字符的大小写可以一起检测,并使用xor al, 32切换。

相关问题