You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基于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
msg4 BYTE "The number of vowels in the input string is: ",0
string BYTE 50 dup(?)
vowelc BYTE 0               ; 初始化元音计数器为0

.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

    ; 新增:判断当前字符是否为元音,是则计数器加1
    mov bl, al
    or bl, 20h              ; 将字符统一转为小写,简化判断逻辑
    cmp bl, 'a'
    je inc_vowel_count
    cmp bl, 'e'
    je inc_vowel_count
    cmp bl, 'i'
    je inc_vowel_count
    cmp bl, 'o'
    je inc_vowel_count
    cmp bl, 'u'
    je inc_vowel_count
    jmp skip_vowel_inc
inc_vowel_count:
    inc vowelc
skip_vowel_inc:

    ; 原有大小写转换逻辑
    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 edx,offset msg3     ;;DISPLAY PROMPT3 MESSAGE
    call writestring
    mov edx,offset string   ;;DISPLAY CHANGED STRING
    call writestring
    call crlf

    ; 新增:输出元音计数结果
    mov edx, offset msg4
    call writestring
    movzx eax, vowelc       ; 将字节型计数器扩展为32位(writeDec需要eax作为参数)
    call writeDec
    call crlf

INVOKE ExitProcess, 0       ;;EXIT
main ENDP
END MAIN

修改说明

  1. 数据段调整:

    • 添加msg4用于显示元音计数的提示文本
    • 初始化vowelc为0,确保计数从0开始
  2. 元音判断逻辑:

    • 在字符处理循环中,读取字符后先将其转为小写(通过or bl, 20h,大写字母加20h会变为小写,小写字母无变化)
    • 逐一判断是否为a/e/i/o/u,是则递增vowelc计数器
    • 该逻辑完全独立于原有大小写转换流程,不会干扰原功能
  3. 结果输出:

    • 在转换后字符串输出完成后,新增元音计数的输出步骤
    • 使用movzx将字节型的vowelc扩展为32位(因为Irvine32的writeDec函数需要32位寄存器eax作为输入)
    • 调用writeDec输出计数结果

内容的提问来源于stack exchange,提问作者Daniel Amaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:50:41