汇编中使用mmap动态分配矩阵内存失败:eax返回大负值且段错误
问题分析与解决
核心错误:系统调用号误用
你当前用的$192是32位Linux下mmap2的系统调用号,而非mmap的。32位Linux中mmap的正确系统调用号是9。误用调用号会导致内核无法识别请求,返回错误码(即你看到的较大负值),后续把错误码当作内存地址访问直接触发段错误。
其他潜在问题与修复
长度计算的隐患
你当前用内存变量x做乘法,mull x会把eax和x的内容相乘,结果存在edx:eax寄存器对,但你只把eax存入len。如果n*n*8的结果超过32位,会丢失高位,导致分配的内存长度不足,后续访问越界。建议改用寄存器完成乘法:movl n, %eax mull n # eax = n * n movl $8, %ebx mull %ebx # eax = n * n * 8,高位存在edx(若需处理大n则需用到) movl %eax, len缺失错误检查
mmap返回负值时表示调用失败(负值是对应的错误码,比如-ENOMEM代表内存不足),必须先检查返回值,再进行后续操作:int $0x80 # 检查调用是否失败:负数的最高位是1,test后SF标志位会置位 test %eax, %eax js error_handle # 跳转到错误处理逻辑,比如打印错误或退出
修正后的mmap调用代码片段
mmap: # 32位Linux下mmap正确系统调用号为9 movl $9, %eax # syscall number for mmap movl $0, %ebx # addr: let kernel choose movl len, %ecx # length: size to allocate movl $3, %edx # PROT_READ | PROT_WRITE movl $0x22, %esi # MAP_ANONYMOUS | MAP_PRIVATE movl $-1, %edi # fd: -1 for anonymous mapping movl $0, %ebp # offset: 0 int $0x80 # 错误检查 test %eax, %eax js error_handler mov %eax, %esi # save valid matrix address
内容的提问来源于stack exchange,提问作者toni06
相关产品推荐
相关产品推荐

