VS2019下32/64位Irvine32汇编实现用户名转大写功能求助
实现逻辑
- 现有代码已完成输入提示、用户输入读取的基础流程,仅缺少小写转大写的遍历处理环节。
ReadString调用后会在EAX寄存器返回用户输入的有效字符长度(不含字符串末尾的结束符),可直接作为循环计数器使用。- 小写字母的ASCII范围为
61h('a')至7Ah('z'),与对应大写字母的ASCII差值固定为20h(十进制32),遍历每个字符时若处于小写范围内,减去20h即可完成转换,非小写字符(数字、符号、大写字母本身)直接跳过即可。
修改后完整可运行代码
Include Irvine32.inc .data askName BYTE 32 DUP (0) ; 输入缓冲区,可按需调整大小 prompt BYTE "Please enter your name: " ,0dh,0ah,0 .code main PROC ; 输出输入提示 mov edx, OFFSET prompt call WriteString ; 读取用户输入 lea edx, askName mov ecx, SIZEOF askName Call ReadString ; EAX返回输入的有效字符长度 ; 小写转大写循环 mov ecx, eax mov esi, OFFSET askName cmp ecx, 0 jle ConvertEnd ConvertLoop: mov al, [esi] cmp al, 'a' jb NextChar cmp al, 'z' ja NextChar sub al, 20h mov [esi], al NextChar: inc esi dec ecx jnz ConvertLoop ConvertEnd: ; 输出转换后的结果 call Crlf mov edx, OFFSET askName call WriteString call Crlf push 0 call ExitProcess main ENDP END main
适配说明
- 代码为32位MASM版本,完全适配Visual Studio + Irvine32环境,无16位链接器依赖。
- 循环逻辑会自动跳过非小写字符,不会破坏原有输入的符号、数字、大写字母内容。
- 如需支持更长的姓名输入,可直接修改
askName变量的DUP参数调整缓冲区大小。
内容的提问来源于stack exchange,提问作者WInslow11b
相关产品推荐
相关产品推荐

