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

汇编中使用mmap动态分配矩阵内存失败:eax返回大负值且段错误

问题分析与解决

核心错误:系统调用号误用

你当前用的$192是32位Linux下mmap2的系统调用号,而非mmap的。32位Linux中mmap的正确系统调用号是9。误用调用号会导致内核无法识别请求,返回错误码(即你看到的较大负值),后续把错误码当作内存地址访问直接触发段错误。

其他潜在问题与修复

  1. 长度计算的隐患
    你当前用内存变量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
    
  2. 缺失错误检查
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:15:27