x86汇编中将斐波那契数列存入数组时触发段错误的问题
x86汇编斐波那契数组存储段错误排查与修复
我用SASM编写x86汇编程序,需求是将第1至第n个斐波那契数存入数组(例如n=5时结果应为[1,2,3,5,8])。算法逻辑本身可行,但执行到将EAX寄存器结果存入数组的步骤时,持续触发段错误(SIGSEGV)。
出错的带数组代码
%include "io.inc" section.data size: DD 5 array: DD 0,0,0,0,0 section .text global CMAIN CMAIN: mov ebp, esp; for correct debugging MOV eax, 1 ;i MOV ebx, 1 ;j MOV edx, [size] MOV ecx, 0 ; index DEC edx ; max. Index fib: CMP ecx, edx JE end MOV edx, ebx ; safe j MOV ebx, eax ; j <- i ADD eax, edx ; i <- j+i (with j from edx) MOV [array+ecx*4],eax ; Program received signal SIGSEGV, Segmentation fault. INC ecx JMP fib end: ret
正常运行的无数组代码
%include "io.inc" section .text global CMAIN CMAIN: mov ebp, esp; for correct debugging MOV eax,1 ; i MOV ebx,1 ; j MOV ecx,0 ; n: index fib: CMP ecx, 4 JE end MOV edx, ebx ; safe j MOV ebx, eax ; j <- i ADD eax, edx ; i <- j+i (with j from edx) INC ecx JMP fib end: ret
SASM构建设置
编译模式选择NASM,目标架构为x86,输出格式为ELF32。
问题原因与修复
核心问题
- 寄存器复用导致索引逻辑失效:初始用
edx存储数组最大索引(size-1),但循环中又用edx临时保存ebx的值,直接覆盖了最大索引。后续循环中cmp ecx, edx的判断完全错误,ecx持续递增超出数组范围,触发非法内存访问。 - 数据段语法错误:原代码中
section.data缺少空格,正确写法应为section .data,该错误会导致汇编器无法正确识别数据段,数组被分配到非法内存区域。
修复后的代码
%include "io.inc" section .data size: DD 5 array: DD 0,0,0,0,0 section .text global CMAIN CMAIN: mov ebp, esp; for correct debugging MOV eax, 1 ;i MOV ebx, 1 ;j MOV edx, [size] MOV ecx, 0 ; index DEC edx ; max. Index fib: CMP ecx, edx JE end MOV esi, ebx ; 换用esi保存临时值,避免覆盖edx MOV ebx, eax ; j <- i ADD eax, esi ; i <- 原j + i MOV [array+ecx*4],eax ; 正确写入数组 INC ecx JMP fib end: ret
内容的提问来源于stack exchange,提问作者HeapUnderStop
相关产品推荐
相关产品推荐

