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

NASM x86中print_arr函数触发SEGFAULT段错误的原因及解决

NASM x86汇编print_arr函数段错误修复

问题说明

编写的NASM x86汇编代码中,print_arr函数运行时触发段错误,调试确认错误发生在push dword [ebx + edx]行,根源是无效内存访问。

错误分析

核心问题是函数参数读取顺序与调用压栈顺序不匹配:

  • print_arr的声明为print_arr(unsigned int *arr, unsigned int len);,遵循x86 cdecl调用约定(参数从右往左入栈)。
  • main中调用时,先压入len1(第二个参数),再压入arr1(第一个参数),栈上参数布局为:
    • [ebp+8]:第一个参数arr的地址(即arr1的内存地址)
    • [ebp+12]:第二个参数len的值(即len1=8)
  • 原代码错误地将[ebp+8]赋值给eax(当作长度),[ebp+12]赋值给ebx(当作数组地址),导致ebx被设置为数值8而非有效内存地址。此时访问[ebx+edx]相当于读取低地址内存(0x8+偏移),属于未分配的无效内存,直接触发段错误。

修复方案

调换print_arr中参数的读取顺序,正确获取数组地址和长度:

修复后的完整print_arr代码:

print_arr:
    push ebp
    mov ebp, esp

    ; 正确读取参数:ebp+8是数组地址,ebp+12是数组长度
    mov ebx, [ebp + 8]  ; ebx = arr
    mov eax, [ebp + 12] ; eax = len
    mov ecx, 0 

    print_loop: 
        cmp ecx, eax
        jge print_end
        mov edx, ecx
        imul edx, 4

        push dword [ebx + edx]
        push format
        call printf
        add esp, 8
        inc ecx
        jmp print_loop

    print_end: 
        push newline_fmt
        call printf
        add esp, 4

    leave
    ret

验证结果

修复后,ebx将正确指向arr1的内存地址,[ebx+edx]可合法访问数组元素,段错误消除,数组内容会按格式正常打印。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:59:55