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

汇编初始化字符串数组触发段错误,请求技术排查支持

段错误排查:汇编初始化字符串数组 + 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:35:22