汇编初始化字符串数组触发段错误,请求技术排查支持
段错误排查:汇编初始化字符串数组 + C函数打印问题
问题描述
正在完成一门汇编课程项目,遇到段错误无法排查。尝试初始化含10个字符串的数组,调用C函数逐个打印数组内容。已确认初始化循环会执行(r8从0到10),但不确定数组初始化是否正确;注释C函数调用后程序无段错误,无法定位问题出在数组初始化还是C函数中。
相关代码
汇编初始化数组代码
init: mov r9, msg mov [arr+r8], r9 add r8, 1 cmp r8, 10 jl init
汇编调用C函数代码
s: mov rdi, arr call display
C打印函数代码
#include <stdio.h> void display (char *arr[]) { printf ("help"); for (int i=0; i<10; ++i) printf (" Message [%d]: %s", i, *arr[i]); }
问题分析与修复
1. 汇编数组初始化的致命错误
x86-64架构下指针长度为8字节,但你的代码每次仅给r8加1,相当于每次只移动1字节存储下一个指针。这会导致指针数据重叠写入,数组中全是无效地址,访问时直接触发段错误。
修复方案:每次循环给r8加8,或者用索引乘以8计算偏移:
init: mov r9, msg ; 以r8为索引,计算8字节指针的偏移地址 mov [arr + r8*8], r9 add r8, 1 cmp r8, 10 jl init
2. C函数中的错误
arr[i]本身就是指向字符串的char*类型,你多做了一次解引用*arr[i],这相当于把字符串的第一个字符当作指针访问,直接触发段错误。
修复方案:去掉多余的*,直接使用arr[i]:
#include <stdio.h> void display (char *arr[]) { printf("help"); for (int i=0; i<10; ++i) printf(" Message [%d]: %s", i, arr[i]); }
额外检查点
- 确保汇编中
arr被正确定义为足够空间,比如arr: times 10 dq 0(预留10个8字节指针的存储空间)。 - 确认
msg是以\0结尾的合法字符串,避免printf越界读取。
内容的提问来源于stack exchange,提问作者dragonfly3515
相关产品推荐
相关产品推荐

