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

x86汇编操作数组存储逐字符读取的输入时出现段错误问题求助

问题分析与修正方案

你的汇编代码存在3个核心逻辑错误,直接导致内存越界访问和段错误:

  • 错误1:索引计算错误
    add eax, indx 这行实际是将indx变量的内存地址加到eax上,而非取indx中存储的索引值。正确写法需要先读取indx的有效值再做地址偏移:
    movzx ebx, byte [indx]  ; 读取索引值,零扩展到ebx
    add eax, ebx            ; 计算numb数组的目标偏移地址
    
  • 错误2:字符存储逻辑错误
    mov [eax], dword char 这行是把char变量的内存地址作为4字节值写入numb数组,且numb是单字节定义的数组,写入4字节会直接越界覆盖后续的indx、char等变量。你需要的是读取char中存储的输入字符,再写入数组对应位置:
    mov bl, [char]          ; 读取输入的单字节字符
    mov [eax], bl           ; 写入数组的对应偏移位置
    
  • 错误3:换行判断逻辑错误
    mov eax, char 后和newl比较,实际是拿char的内存地址和换行符的ASCII值比较,永远不可能相等,会导致循环无限执行,数组越界写爆内存。正确的判断逻辑是直接读取char存储的字符值和换行符比较:
    cmp byte [char], 0ah    ; 直接判断输入的字符是不是换行
    jne read
    

修正后可正常运行的关键代码段

_start:
    push  msg1
    push  len1
    call  print

read:
    push  char
    call  getc

    mov   eax, numb
    movzx ebx, byte [indx]
    add   eax, ebx
    mov   bl, [char]
    mov   [eax], bl

    inc   byte [indx]

    cmp   byte [char], 0ah
    jne   read

    jmp   exit

运行后输入的字符会按顺序存入numb数组,遇到换行自动退出,不会触发段错误。

内容的提问来源于stack exchange,提问作者mikaela.md

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:36:03