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操作,安全平衡栈数组访问越界
需确认两个关键事项:%edi指向的数组必须有足够的存储空间,大小至少为nodes * 4字节,否则写入数据时会越界;- 调用
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
相关产品推荐
相关产品推荐

