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

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

四、关键优化说明

  1. 缓冲区类型修正:将num1的定义从dw改为db,因为ASCII字符串的每个字符仅占1字节,dw会导致内存存储错误。
  2. 非法输入处理:增加了对非数字字符的判断,避免转换结果异常。
  3. 奇偶判断优化:使用test eax, 1替代and ax, 1,test仅影响标志位,不修改原寄存器值,更符合汇编编程的高效习惯。
  4. 输入方法建议:MASM32的StdIn适合简单场景,如果需要更严格的输入限制(比如仅允许输入数字),可以结合Windows API的键盘消息处理实现实时过滤,但对于基础需求,StdIn配合转换时的合法性检查足够使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:46:05