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

x86 AT&T汇编向数组读取元素时出现段错误问题

解决汇编代码段错误的问题

先给你梳理几个直接导致段错误的核心原因,对应你的代码逐一修正:

  • temp空间分配不足
    你提到temp是.space类型,如果只分配了1字节(比如.space 1),但x86环境下scanf读取整数需要4字节的存储空间,写入时会直接越界覆盖其他内存区域,触发段错误。
    修正方案:给temp分配足够的4字节空间:

    temp: .space 4  ; 分配4字节存储int类型数据
    
  • 栈平衡的不规范写法
    调用scanf后你用两次popl %ebx清理栈,虽然能达到平衡栈的效果,但会破坏%ebx寄存器中原有的值(如果之前该寄存器被使用过)。更稳妥且规范的方式是直接用addl $8, %esp平衡栈(因为你压入了两个4字节的参数):

    pushl $temp  
    pushl $format
    call scanf
    addl $8, %esp  ; 替代两次pop操作,安全平衡栈
    
  • 数组访问越界
    需确认两个关键事项:

    1. %edi指向的数组必须有足够的存储空间,大小至少为nodes * 4字节,否则写入数据时会越界;
    2. 调用set_array时,%ecx的初始值必须为0,如果初始值过大,第一次访问(%edi, %ecx, 4)就会直接超出数组范围。
  • 格式字符串format定义错误
    确保format是用于读取整数的正确格式:

    format: .string "%d"
    

修正后的完整代码片段

; 补全必要的全局变量定义
nodes: .long 0
format: .string "%d"
temp: .space 4  ; 必须分配4字节存储int类型

set_array:    
    cmp nodes, %ecx 
    je array_sum

    pushl $temp  
    pushl $format
    call scanf
    addl $8, %esp  ; 平衡栈

    movl temp, %ebx
    movl %ebx, (%edi, %ecx, 4)

    inc %ecx
    jmp set_array

array_sum:
    ; 此处编写后续的求和逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:50:20