assembly 我似乎找不到一种方法来广告元音计数器为我的程序,它必须使用Irvine32.inc,以便有效

z5btuh9x  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(149)
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

有些我如何找到一种方法来添加一个元音计数器到这个程序没有搞乱动画,但我不知道如何任何建议
我试着在我的书上寻找选项,但我找不到任何相关的代码。
我也试着看看其他方面的一些信息,但没有人接缝能够帮助我,所以这是我最后的希望SOS请。

1dkrff03

1dkrff031#

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切换。

相关问题