如何在基于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
修改说明
数据段调整:
- 添加
msg4用于显示元音计数的提示文本 - 初始化
vowelc为0,确保计数从0开始
- 添加
元音判断逻辑:
- 在字符处理循环中,读取字符后先将其转为小写(通过
or bl, 20h,大写字母加20h会变为小写,小写字母无变化) - 逐一判断是否为a/e/i/o/u,是则递增
vowelc计数器 - 该逻辑完全独立于原有大小写转换流程,不会干扰原功能
- 在字符处理循环中,读取字符后先将其转为小写(通过
结果输出:
- 在转换后字符串输出完成后,新增元音计数的输出步骤
- 使用
movzx将字节型的vowelc扩展为32位(因为Irvine32的writeDec函数需要32位寄存器eax作为输入) - 调用
writeDec输出计数结果
内容的提问来源于stack exchange,提问作者Daniel Amaya
相关产品推荐
相关产品推荐

