You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动