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

基于Irvine32库的x86汇编字符判断功能异常问题咨询

问题根因
  • 主流程逻辑截断:调用isLower后直接通过jz ISUP/jnz Lowrr跳转,后续数字判断代码完全没有执行路径,所有输入只会进入大写/小写分支。
  • isLower函数判断逻辑完全错误:
    小写字母的ASCII范围是0x61('a')~0x7A('z'),当前代码错误和大写字母范围A-Z对比,且cmp al, "A"后直接用jnz LOWERTRUE把所有不等于'A'的字符都判定为小写,这是数字也进入小写分支的直接原因。
  • 大写判断逻辑缺失:isLower返回0就直接跳大写分支,没有校验输入是否真的在A-Z范围内,非小写的非大写字符也会被误判为大写。
  • 数字判断前置测试失效:test eax, 0的运算结果永远为0,jz Number分支永远不会触发,即便流程走到数字判断逻辑也无法正确识别数字。
  • isLower/isDigit内部跳转逻辑全部写反,没有正确用进位/零标志判断ASCII区间。
修正后代码
.data   
    digit   BYTE    "Number",0ah,0dh,0
    upper   BYTE    "Upper case",0ah,0dh,0
    lower   BYTE    "Lower case",0ah,0dh,0
    prompt  BYTE    "Enter input from keyboard",0ah,0dh,0
    error   BYTE    "Error. Neither (0/A)",0ah,0dh,0

.code
main PROC
    mov edx, OFFSET prompt
    call writeString
    call readChar ; 输入字符存储在al寄存器中

    ; 第一步判断是否为小写字母
    call isLower
    cmp eax, 1
    je Lowrr

    ; 第二步判断是否为大写字母
    call isUpper
    cmp eax, 1
    je ISUP

    ; 第三步判断是否为数字
    call isDigit
    cmp eax, 1
    je Number

    ; 均不匹配输出错误信息
    mov edx, offset error
    call writeString
    JMP EXITOUT

Lowrr:
    mov edx, OFFSET lower
    call writeString
    jmp EXITOUT
ISUP:
    mov EDX, OFFSET upper
    call writeString
    JMP EXITOUT
Number:
    mov EDX, OFFSET digit
    call writeString
    JMP EXITOUT

EXITOUT:
    exit
main ENDP

isLower PROC
    cmp al, 'a'
    jb LOWERFALSE ;  ASCII值小于a不属于小写
    cmp al, 'z'
    ja LOWERFALSE ; ASCII值大于z不属于小写
    LOWERTRUE:
        mov eax, 1
        ret
    LOWERFALSE:
        mov eax, 0
        ret
isLower ENDP

isUpper PROC
    cmp al, 'A'
    jb UPPERFALSE ; ASCII值小于A不属于大写
    cmp al, 'Z'
    ja UPPERFALSE ; ASCII值大于Z不属于大写
    UPPERTRUE:
        mov eax, 1
        ret
    UPPERFALSE:
        mov eax, 0
        ret
isUpper ENDP

isDigit PROC
    cmp al, '0'
    jb DigitFALSE ; ASCII值小于0不属于数字
    cmp al, '9'
    ja DigitFALSE ; ASCII值大于9不属于数字
    DigitTRUE:
        mov eax, 1
        ret
    DigitFALSE:
        mov eax, 0
        ret
isDigit ENDP
END main

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:02