MASM32汇编:字符串转整数方法及奇偶判断、输入优化问询
MASM32字符串转整数与奇偶判断优化
一、你的代码核心问题
你直接将字符串变量num1加载到ax的操作是错误的——num1存储的是用户输入的ASCII字符串,并非二进制整数值,这导致后续的奇偶判断完全失效。必须先把ASCII字符串转换为二进制整数,再进行逻辑处理。
二、字符串转整数的实现逻辑
MASM32没有内置的字符串转整数函数,需要手动实现转换子程序。核心思路是:遍历字符串的每个字符,将当前计算结果乘以10,加上当前字符对应的数字(通过字符ASCII值减去'0'得到),直到遇到字符串结束符0或非数字字符。
转换子程序示例
; 输入:ESI = 字符串首地址 ; 输出:EAX = 转换后的32位无符号整数(如需处理负数可扩展逻辑) StrToInt proc xor eax, eax ; 初始化结果为0 next_char: movzx ecx, byte ptr [esi] ; 取出当前字符(零扩展到32位) cmp ecx, 0 ; 遇到字符串结束符则退出 je done cmp ecx, '0' jb done ; 字符小于'0',视为非法输入,退出 cmp ecx, '9' ja done ; 字符大于'9',视为非法输入,退出 sub ecx, '0' ; 将ASCII字符转为数字 imul eax, 10 ; 当前结果乘以10 add eax, ecx ; 加上当前数字 inc esi ; 指向下一个字符 jmp next_char done: ret StrToInt endp
三、优化后的完整代码
结合输入、转换、奇偶判断与错误处理的完整代码如下:
.386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data num1 db 70 dup(0) ; 用db定义字符串缓冲区(每个ASCII字符占1字节) prompt db "Enter the number: ",0 evenmsg db "This is an even number",0 oddmsg db "This is an odd number",0 errmsg db "Invalid input!",0 .code start: ; 输出提示信息 push offset prompt call StdOut ; 获取用户输入 push 70 push offset num1 call StdIn ; 转换字符串为整数 mov esi, offset num1 call StrToInt ; 检查转换结果合法性 cmp eax, 0 jz check_zero_input ; 结果为0时,需判断是输入了0还是非法字符 ; 奇偶判断:test指令仅修改标志位,比and更高效 test eax, 1 jz even_num jmp odd_num check_zero_input: ; 验证输入是否为合法的"0" cmp byte ptr [num1], '0' jz even_num ; 非法输入输出错误信息 push offset errmsg call StdOut jmp exitx even_num: push offset evenmsg call StdOut jmp exitx odd_num: push offset oddmsg call StdOut jmp exitx ; 字符串转整数子程序 StrToInt proc xor eax, eax next_char: movzx ecx, byte ptr [esi] cmp ecx, 0 je done cmp ecx, '0' jb done cmp ecx, '9' ja done sub ecx, '0' imul eax, 10 add eax, ecx inc esi jmp next_char done: ret StrToInt endp exitx: push 0 call ExitProcess end start
四、关键优化说明
- 缓冲区类型修正:将
num1的定义从dw改为db,因为ASCII字符串的每个字符仅占1字节,dw会导致内存存储错误。 - 非法输入处理:增加了对非数字字符的判断,避免转换结果异常。
- 奇偶判断优化:使用
test eax, 1替代and ax, 1,test仅影响标志位,不修改原寄存器值,更符合汇编编程的高效习惯。 - 输入方法建议:MASM32的
StdIn适合简单场景,如果需要更严格的输入限制(比如仅允许输入数字),可以结合Windows API的键盘消息处理实现实时过滤,但对于基础需求,StdIn配合转换时的合法性检查足够使用。
内容的提问来源于stack exchange,提问作者How
相关产品推荐
相关产品推荐

