NASM X86中read_int输入08与8时斐波那契二进制输出异常
问题分析与解决方案
核心问题:前导零输入被错误解析为八进制
你遇到的问题本质是带前导零的输入触发了八进制解析逻辑:
- 输入
8时,程序正常按十进制解析为数字8,对应第8个斐波那契数13(二进制10101b),结果正确。 - 输入
08时,程序误将其识别为八进制数,但八进制体系中不存在数字8,这会导致解析逻辑出错,生成错误的数值,最终计算出完全不符的斐波那契数并输出错误二进制。
修复步骤
1. 强制输入按十进制解析
如果你的程序是自己实现字符串转数字逻辑,需要修改核心转换规则:
- 跳过输入字符串开头的所有前导零(除非输入本身就是单个
0)。 - 转换时严格使用十进制基数(每一位数字乘以10累加,而非8)。
如果是调用C标准库的转换函数(比如strtol),要明确指定基数为10,避免自动识别八进制:
; 示例:调用strtol时强制十进制解析 push dword 0 ; 传入endptr参数 push dword 10 ; 指定基数为10 push input_str ; 输入字符串 call strtol add esp, 12 ; 清理栈空间
2. 强化输入合法性校验
结合你代码里的invalid_msg,可以扩展校验逻辑:
- 检查输入是否包含非数字字符(斐波那契数序号应为正整数,可排除正负号)。
- 检测是否存在"前导零+非零数字"的非法输入格式,直接触发错误提示。
示例修正代码(自定义字符串转十进制逻辑)
如果是自己实现的转换逻辑,可参考以下修改后的汇编伪代码:
; 修正后的十进制转换:跳过前导零+严格十进制计算 convert_to_decimal: mov eax, 0 ; 跳过开头所有的'0' skip_leading_zero: mov bl, [esi] cmp bl, '0' jne start_convert inc esi jmp skip_leading_zero start_convert: next_digit: mov bl, [esi] cmp bl, 0 je convert_done ; 校验是否为合法数字 cmp bl, '0' jb invalid_input cmp bl, '9' ja invalid_input ; 十进制累加计算 sub bl, '0' imul eax, 10 add eax, ebx inc esi jmp next_digit invalid_input: ; 跳转到输出invalid_msg的代码段 convert_done: ret
内容的提问来源于stack exchange,提问作者Róbert Pollák




