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

x86架构FASM实现字符串反转程序运行异常问题咨询

问题根因分析
  • 核心错误1:未使用实际读取的字符串长度,硬编码处理长度为5
    你调用str_len获取到的字符串实际长度存储在eax寄存器中,但后续直接执行了mov edx, MAX_USER_STR将处理长度硬编码为5,这是两个异常的直接诱因:
    • 输入长度小于5时,程序会多读内存中用户输入缓冲区后的垃圾数据压栈,反转后写入的内容包含不可打印字符或直接破坏字符串结束符,导致无输出
    • 输入长度大于5时,程序只处理前5个字符,因此仅反转前5字节
  • 逻辑隐患1:print_eax调用可能破坏字符存储
    你在读取字符到al后调用了print_eax,如果该函数会修改eax寄存器的值,会导致后续压入栈的字符不是原始输入的字符,引发反转结果错误。
  • 逻辑隐患2:未做缓冲区边界校验
    读取用户输入时未限制最大读取长度,输入超过MAX_USER_STR长度的字符串会触发缓冲区溢出,破坏内存数据。
修复方案
  1. 替换硬编码的长度赋值,将mov edx, MAX_USER_STR改为mov edx, eax,使用str_len返回的实际字符串长度作为处理长度
  2. 调整字符读取与调试输出的顺序,先压栈字符再调用print_eax,避免寄存器值被篡改
  3. 增加缓冲区边界校验,避免实际长度超过缓冲区大小引发溢出
修复后核心代码片段示例
start:
        mov esi, enter_string
        call print_str
        mov edi, user_str
        call read_line
        call str_len
        ; 修复:用实际字符串长度代替硬编码的5
        mov edx, eax 
        ; 加边界校验,避免长度超过缓冲区大小
        cmp edx, MAX_USER_STR
        jbe len_ok
        mov edx, MAX_USER_STR
len_ok:
        mov ebx, 0
        mov ecx, 0
        mov esi, user_str
        call print_str
        mov esi, newline
        call print_str
        mov esi, user_str
for_loop : 
        mov al, byte[esi]
        inc esi
        inc ebx
        ; 先压栈原始字符,再调用打印避免被篡改
        push eax
        call print_eax
        cmp edx, ebx
        jb clear_register
        jmp for_loop    

; 后续循环、跳出逻辑保持原有代码即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:45:04