基于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
相关产品推荐
相关产品推荐

