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
相关产品推荐
相关产品推荐

